gpt4 book ai didi

c - 在 ICU 中打印 UTF-8 字符串

转载 作者:太空宇宙 更新时间:2023-11-04 04:41:10 24 4
gpt4 key购买 nike

我最近发现了 ICU 的 ustdio.h 并认为测试它会很有趣。没过多久就发现有些不对劲。

Python 3 在其字符串文字中支持 UTF-8,因此像这样的语句

print("90°")

有效。

ICU(在 C API 中)提供了 u_printf()u_printf_u(),后者是为任何 UChar 设计的关于系统的实现,但至少是 UTF-16。

为了测试,我尝试打印出一个特殊字符,度数符号。

u_printf("90%c\n", 0xB0);

打印 90�,如下所示:

u_printf(u8"90%c\n", 0xB0);
u_printf("90°\n");
u_printf(u8"90°\n");
u_printf_u(u"90%c\n", 0x00B0);

然而,实际上在 UTF-16 字符串文字中声明该字符得到了预期的结果。

u_printf_u(u"90°\n");

$ ./a.out
90°

我可以坚持这个,但我想要符合 UTF-8 标准;这似乎是一个高级系统。为什么 C11 的 UTF-8 字符串文字与 ICU 的 u_printf() 不兼容?

最佳答案

我能够通过创建一个包含 Unicode 字符的字符串文字并将其作为 char * 参数传递给 printf() 来解决这个问题。

以下代码将行 José 90°\n 打印四次。

char *s = u8"José 90°";
for (int i = 0; i < strlen(s); ++i)
putchar(s[i]);
putchar('\n');
printf("%s\n", s);
u_printf("%s\n", s);

UErrorCode error = U_ZERO_ERROR;
u_init(&error);
UChar *s16 = malloc(256*sizeof(UChar));
u_strFromUTF8(s16, 256, NULL, s, strlen(s), &error);
u_printf_u(u"%S\n", s16);

free(s16);

缓冲区s16可以配合u_strToUTF8()使用,返回成功,兼容UTF-8函数。 ICU 中的内部事物似乎更喜欢 UTF-16(我想它更容易解析),因此您需要先转换为它,然后再转换回 UTF-8 以返回给调用者。

关于c - 在 ICU 中打印 UTF-8 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26403877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com