宽字符GNU libc printf

宽字符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;

我正在读取一个包含多字节字符和单字节字符(如ASCII字符)的文件。我不明白为什么这段代码没有打印出文件的确切内容。相反,垃圾字符被打印出来

下面的代码每次只能从源代码中读取一个字符,并且 把文件打印出来

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