宽字符GNU libc printf
我正在读取一个包含多字节字符和单字节字符(如ASCII字符)的文件。我不明白为什么这段代码没有打印出文件的确切内容。相反,垃圾字符被打印出来 下面的代码每次只能从源代码中读取一个字符,并且 把文件打印出来宽字符GNU libc printf,c,unicode,glibc,C,Unicode,Glibc,我正在读取一个包含多字节字符和单字节字符(如ASCII字符)的文件。我不明白为什么这段代码没有打印出文件的确切内容。相反,垃圾字符被打印出来 下面的代码每次只能从源代码中读取一个字符,并且 把文件打印出来 char input[] = ... <- File contents is stored there char * current; int length = strlen (input); current = input; mbstate_t state;
char input[] = ... <- File contents is stored there
char * current;
int length = strlen (input);
current = input;
mbstate_t state;
memset (&state, '\0', sizeof (state));
while (current < &input[ strlen(input) - 1])
{
wchar_t character;
size_t nbytes = mbrtowc (&character, current, length, &state);
if (nbytes == (size_t) -2 || nbytes == (size_t) -1)
{
fprintf (stderr, "mbrtowc returned error %ld\n", nbytes);
return -1;
}
fprintf (stdout, "%ls", &character);
current += nbytes;
length -= nbytes;
}
太棒了 应
fprintf(标准输出、%ls、&character)代码>改为fprintf(标准输出,“%lc”,字符)代码>?%ls将在字符
后面的内存中搜索任何内容,在找到NUL之前,它需要一个wchar\t字符串。它应该是wprintf(“%lc”,字符)代码>那么,不是吗?顺便说一句,我想我会用iconv。哦,天哪,那天晚上我在想什么!如果你们中的一位可以把它作为一个答案,我可以用绿色标记它,你看到的是原始程序和iconv的一个片段-我什么都不知道,也不会有帮助-但我很高兴知道它的存在,因为它迟早会派上用场的代码>改为fprintf(标准输出,“%lc”,字符)代码>?%ls将在字符
后面的内存中搜索任何内容,在找到NUL之前,它需要一个wchar\t字符串。它应该是wprintf(“%lc”,字符)代码>那么,不是吗?顺便说一句,我想我会用iconv。哦,天哪,那天晚上我在想什么!如果你们中的一个人可以把它作为一个答案,我可以用绿色标记它,你看到的是原始程序和iconv的一个片段——我什么都不知道,也不会有帮助——但我很高兴知道它的存在,因为它迟早会派上用场的。
_
–
_
F
I
N
A