1

无论其编码如何(UTF-8、16、32),我都想在屏幕上打印一个字符串。该字符串以 char 数组表示,因此我需要忽略空字节并继续打印到标准输出;这让 printf 的家人和朋友无从谈起。

char text[] = { 0x00, 0x55, 0x00, 0x6E, 0x00, 0x69, 0x00, 0x63, 0x00, 0x6F, 0x00, 0x64, 0x00, 0x65 };

fwrite( text, sizeof(char), sizeof(text), stdout );

为此,我选择了上述解决方案,以使我能够打印所有 UTF 编码格式。我了解某些终端无法正确显示字符,但这不是我关心的问题,因为它是应用程序之外的可配置选项。

我的应用程序设置了要加载的消息目录(en_EN.UTF-8 等),但是我想避免必须根据当前选择的语言环境在代码中进行字符串转换。

在我让它上线之前,我可以对这种方法进行审查吗?

4

2 回答 2

1

你不能那样做。当您处理文本时,编码很重要。所以你必须进行转换。

将内容保存在 char 数组中也很糟糕,您应该使用字节数组。因为:

  • 如果尚未在某些标头中定义,则应将(或 typedef)字节定义为无符号字符。普通字符可以有符号也可以无符号,你会有惊喜。
  • 更具可读性,因为它使意图清晰。我看到字节,它是一堆字节。我看到 char,它是纯文本(在你的情况下,显然不是这样)
于 2011-12-01T11:16:54.207 回答
0

如果您在 Big-Endian 模式下定义 char 数组并且终端接受 Little-Endian 怎么办?或者反之亦然?我也认为,在处理事物时你不能没有转换char -> Utf(仅因为字节序)。定义一些也是合理的

typedef unsigned char  utf8char;
typedef unsigned short utf16char;
typedef unsigned int   utf32char;

typedef enum {
   BIG_ENDIAN,
   LITTLE_ENDIAN
} CHAR_ENDIANNESS

这样,您将更透明地转换为 UTF,调试将更容易,代码维护也将得到改善。

于 2011-12-01T15:58:44.103 回答