如何从UTF-8字符串中获取字符?

问题描述 投票:0回答:2
char *w = "Artîsté";
printf("%lu\n", strlen(w));
int z;
for(z=0; z<strlen(w); z++){
    //printf("%c", w[z]);  //prints as expected
    printf("%i: %c\n", z, w[z]);//doesn't print anything
}

如果我运行这个,它会在

î
处失败。如何打印多字节字符以及如何知道何时击中了多字节字符?

c character multibyte-characters
2个回答
1
投票

如果您的执行环境使用 UTF-8(例如 Linux),只要您在调用 printf 之前设置合适的区域设置(如

setlocale(LC_ALL, "en_US.utf9");
所示),您的代码就会按原样运行。

演示:http://ideone.com/zFUYM

否则,最好的选择可能是转换为宽字符串并打印它。如果您计划对该字符串的各个字符执行 I/O 以外的操作,那么您无论如何都必须执行此操作。

对于命中多字节字符,可移植的测试方法是

mblen()
返回的值是否大于 1。


1
投票

使用宽字符和多字节函数:

int utf8len(char *str)
{
    char *top=str+strlen(str);
    int len;
    for(len=0; str<top; len++)
        str+=mblen(str, top-str);
    return len;
}

int main()
{
    setlocale(LC_ALL, "en_US.utf8");
    char *w = "Artîsté";
    printf("%lu\n", strlen(w));

    int z, len = utf8len(w);
    wchar_t wstr[len+1];
    mbstowcs(wstr, w, len);
    for(z=0; z<len; z++)
        printf("%i: %lc\n", z, wstr[z]);
}

你对第一个 printf 很幸运,因为你从未更改过数据,一旦你分割了字符,你的输出就不再是 utf8。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.