c - 打印 UTF8 字符串的每个字符

标签 c string utf-8 icu

我对字符串的 Unicode/UTF8 表示形式很陌生。我正在尝试读取 UTF8 编码文件,用空格分隔,然后打印每个单词中的每个字符/代码点(用空格分隔)。

我能够使用wchar_t(我知道它内部使用utf16utf32(?))从文件中读取文本,打印它并将其写入另一个文件。但是,我无法使用 wchar_t 获取子字符串或逐个元素地遍历它。

为了解决这个问题,我使用了 IBM 的 ICU 库。代码:

while (fgetws(readString, 1000, wifile) != NULL) {
        wprintf(L"String: %s\n", readString);
        //split string on the base of spaces.
        wchar_t *nextToken = NULL;
        wchar_t *token = wcstok_s(readString, L" ", &nextToken);
        UChar *utf8Token = (UChar *)token;
        u_printf("Token in UChar: %S\n", utf8Token);
        while (token != NULL) {
            printf("Hello.\n");
            fwprintf(wofileString, L"%ls and length: %d\n", token, wcslen(token));
            fwprintf(wofileString, L"UTF8 rep:%s and length: %d\n", utf8Token, u_strlen(utf8Token));
            int32_t counter = 0;
            for (counter = 0; counter < u_strlen(utf8Token);) {
                UChar32 ch;
                U8_NEXT(utf8Token, counter, u_strlen(utf8Token), ch);
                fwprintf(wofileString, L"Token[%d] = ", counter);
                if (ch < 127) {
                    printf("Less than 127.\n");
                    if (ch > 1) {
                        printf("Printing%d.\n", ch);
                        u_fprintf((UFILE *)wofileString, "%c\n", (UChar)ch);
                    }
                } else if (ch == CharacterIterator::DONE) {
                    printf("Done.\n");
                    u_fprintf((UFILE *)wofileString, "[CharacterIterator::DONE]\n");
                } else {
                    printf("More than 127.\n");
                    u_fprintf((UFILE *)wofileString, "[%X]\n", ch);
                }
            }
            token = wcstok_s(NULL, L" ", &nextToken);
            utf8Token = (UChar *)token;
            counter = 0;
        }
        fputws(L"Complete String: ", wofileString);
        fputws(readString, wofileString);
        fputws(L"\n", wofileString);
    }

当程序到达打印字符的部分时,它总是停止工作。

我的问题:
1. 如何打印输入的UTF8字符串中的所有“字符”?
2. 转换:UChar *utf8Token = (UChar *) token; 是否正确?假设token的内部表示是UTF16还是UTF32
3.我哪里出错了?
4. 如何获取字符串的子串?

最佳答案

fwprintf(wofileString,... u_fprintf((UFILE *)wofileString,…

这两行中有一个是错误的,具体取决于 wofileString 实际是什么。

我建议仅使用 u_… 函数。

事实上,我只是使用 u_printf("string", …)u_printf_u(L"String", …) 而不是 fwprintffputws

关于c - 打印 UTF8 字符串的每个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38055447/

相关文章:

mysql - utf8_unicode_ci 在 mysql 中支持土耳其语吗?

PHP:检查链接是否为图像并检查是否存在

python json 加载和 unicode

c - K&R 第 8 章,readdir 函数

c - 在C中的字符串前后添加一些字母

java - 需要将输入文本的每个字母替换为另一个特定字母

c++ - 在构造函数中初始化常量字符串? C++

python - python 脚本中的日文字符

c - 我该如何解决这个问题

c++ - 改变一点整数