我尝试将wchar_t字符串打印到终端,但字符串不显示或显示为不可读字符。
我尝试了XUbuntu 22.04
和gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0
,你可以在这里看到示例代码,
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "en_US.UTF-8");
wchar_t sample1[] = { L"Sample TEXT\\自己人自己人人 AZZZZZZZA己中国中中中\n" };
printf("AAAA\n");
printf("%ls", L"ABCD");
printf("%ls", sample1);
return 0;
}
我用gcc编译它如下
gcc test.c -fshort-wchar -o test
我在Windows上将数据以unicode格式写入文件,在Linux上读取文件并打印其内容。所以wchar_t在Windows上是16位,但在Linux上是32位,这就是为什么我使用-fshort-wchar
gcc标志。
在上面代码的输出中,我只能看到“AAAA\n”。
我的代码有什么问题?我如何在C中正确地打印unicode wchar_t并能够在我的终端中读取它?
我将按照第一条评论中的建议重新措辞我的问题,我在Windows上保存了一个文件为utf-16,如何在Linux上打印它?
谢谢
2条答案
按热度按时间xdnvmnnf1#
我的代码有什么问题?
代码的问题在于您使用了
-fshort-wchar
,而glibc被编译为与32位wchar_t一起使用。反过来,printf("%ls"
作为32位数组访问内存,而该数组具有16位元素。我如何在C中正确地打印unicode wchar_t并能够在我的终端中读取它?
不要使用
-fshort-wchar
或编译任何你使用的东西,比如C标准库和其他你缩进使用-fshort-wchar
的库。在Windows上,我将数据作为unicode文件,在Linux上,我应该读取该文件并打印其内容
然后你必须知道windows写入文件的“unicode”格式。一旦知道了,通常使用
iconv
命令或函数来转换文件。你也可以使用像libunistring或者icu这样的库来处理unicode。rqqzpn5f2#
每个流,例如
stdout
,都有一个char
或wchar_t
的 * 方向 *,最初可以处理其中任何一个。一旦第一个I/O发生,例如printf("AAAA\n");
方向就建立了。在这种情况下,为char
。要可能随后打印到另一个方向,请首先重新打开流。
每个流都有一个方向。在流与外部文件关联之后,但在对其执行任何操作之前,流没有方向。一旦宽字符输入/输出函数已经被应用于没有定向的流,该流就变成宽定向流。类似地,一旦字节输入/输出函数已经被应用于没有定向的流,该流就变成面向字节的流。只有对
freopen
函数或fwide
函数的调用可以改变流的方向。(对freopen
的成功调用将删除任何方向。C17dr §7.21.2 4.在调查I/O问题时,测试返回值非常有用。