2011-12-23 41 views
0
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 
} 

如果我运行它,它会崩溃在“”上。如何打印多字节字符,以及如何知道何时打出多字节字符?如何从utf8字符串中获取字符

+3

*我怎么知道什么时候我碰到了多字节字符?*高位是1. – 2011-12-23 03:31:15

+1

您可能想看看UTF8是什么:http://en.wikipedia.org/wiki/UTF-8 – 2011-12-23 03:31:47

+0

哪条线会崩溃?什么平台? – 2011-12-23 03:33:34

回答

1

如果你的执行环境使用UTF-8(Linux为例),您的代码将工作作为 - 是的,只要你设置一个合适的场所,如setlocale(LC_ALL, "en_US.utf9");调用一个的printf之前。

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

否则,你最好的选择可能是转换成宽字符串并打印。如果你打算用该字符串的单个字符做I/O以外的事情,那么你必须这样做。

至于打多字节字符,测试可移植的方法是,如果mblen()返回一个值大于1

+0

该代码有效。但它不适用于OP printf(“%i:%c \ n”,z,w [z]);' – nos 2011-12-23 18:59:10

+0

@nos哦,它是在我回答后编辑的。 Dave的回答是正确的,然后, – Cubbi 2011-12-23 19:43:37

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。

+0

这对我不起作用,它一旦打到“¡”就停止打印输出。 – joels 2011-12-23 17:50:12

+0

如果您尚未设置语言环境,请将'setlocale(LC_ALL,“en_US.utf8”);'放在文件的顶部。 – Dave 2011-12-23 18:28:14

相关问题