在linux上使用gcc打印unicode字符

vhipe2zx  于 2023-06-21  发布在  Linux
关注(0)|答案(2)|浏览(166)

我尝试将wchar_t字符串打印到终端,但字符串不显示或显示为不可读字符。
我尝试了XUbuntu 22.04gcc (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上打印它?
谢谢

xdnvmnnf

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。

rqqzpn5f

rqqzpn5f2#

每个流,例如stdout,都有一个charwchar_t的 * 方向 *,最初可以处理其中任何一个。一旦第一个I/O发生,例如printf("AAAA\n");方向就建立了。在这种情况下,为char
要可能随后打印到另一个方向,请首先重新打开流。
每个流都有一个方向。在流与外部文件关联之后,但在对其执行任何操作之前,流没有方向。一旦宽字符输入/输出函数已经被应用于没有定向的流,该流就变成宽定向流。类似地,一旦字节输入/输出函数已经被应用于没有定向的流,该流就变成面向字节的流。只有对freopen函数或fwide函数的调用可以改变流的方向。(对freopen的成功调用将删除任何方向。C17dr §7.21.2 4.

printf("AAAA\n");
FILE *f = freopen(NULL, "w", stdout);
if (f == NULL) Handle_failure();
printf("%ls", L"ABCD");

在调查I/O问题时,测试返回值非常有用。

int retval = printf("AAAA\n");
assert(retval >= 0);
retval = printf("%ls", L"ABCD");
assert(retval >= 0);

相关问题