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
}
如果我运行它,它就会崩溃。如何打印多字节字符,如何知道我何时遇到多字节字符?
答案 0 :(得分:1)
如果您的执行环境使用UTF-8(例如Linux),只要您在调用printf之前设置合适的语言环境(例如setlocale(LC_ALL, "en_US.utf9");
),您的代码就会按原样运行。
否则,您最好的选择可能是转换为宽字符串并打印出来。如果您计划使用该字符串的单个字符执行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了。