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
}
如果我运行这个,它会在
î
处失败。如何打印多字节字符以及如何知道何时击中了多字节字符?
如果您的执行环境使用 UTF-8(例如 Linux),只要您在调用 printf 之前设置合适的区域设置(如
setlocale(LC_ALL, "en_US.utf9");
所示),您的代码就会按原样运行。
否则,最好的选择可能是转换为宽字符串并打印它。如果您计划对该字符串的各个字符执行 I/O 以外的操作,那么您无论如何都必须执行此操作。
对于命中多字节字符,可移植的测试方法是
mblen()
返回的值是否大于 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。