如何从utf8字符串中获取字符

时间:2011-12-23 03:29:11

标签: c character multibyte

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
}

如果我运行它,它就会崩溃。如何打印多字节字符,如何知道我何时遇到多字节字符?

2 个答案:

答案 0 :(得分:1)

如果您的执行环境使用UTF-8(例如Linux),只要您在调用printf之前设置合适的语言环境(例如setlocale(LC_ALL, "en_US.utf9");),您的代码就会按原样运行。

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

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

至于命中多字节字符,可测试的便携式方法是mblen()是否返回大于1的值。

答案 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了。