3

我有一个由 Visual Age 开发的 ANSI C++ 项目。我想将其转换为 Unicode,以便它可以在英文操作系统中正确显示多语言字符。我在定义宏后将所有char变量更改为。wchar_tUNICODE

这是正确的方法吗?源代码中有一些 API 只接受char*字符串(例如system(), fopen(), mkdir())。wchar_t由于代码中的所有字符串都已更改为,如何使它们与字符串一起使用wchar_t

4

2 回答 2

1

有几种表示 unicode 字符串的方法,最常见的有:

  • 编码UTF-8,存储在char字符串中
  • 编码UTF-16,存储在由 16 位整数组成的字符串中
  • 编码UTF-32,存储在由 32 位整数组成的字符串中。

对于 UTF-16 和 UTF-32,您必须了解系统的字节顺序,并决定是否要以大端或小端顺序通信字符串。

有一个较旧的编码名为UCS-2,使用这种编码只能表示 0x10000 以下的 unicode 字符。你不应该使用这个,不是所有的汉字都可以在其中表示。

要注意的另一件事是它wchar_t是 2 字节或 4 字节宽,因此在某些系统上它可以用来保存UTF-16,而在其他UTF-32字符上。

要注意的另一件事:大多数字符串长度函数将返回计数的字节数或字数,而不是表示的 unicode 符号数。

我个人更喜欢将内部和外部的所有内容存储为UTF-8,并根据需要转换为 16 位或 32 位编码。这样可以避免字节顺序问题。

很有可能,如果您确保所有内容都被编码UTF-8,那么大多数东西都会正常工作。

于 2013-01-31T08:58:22.187 回答
1

很难说不知道你对文本做了什么,以及它来自哪里。如果您所做的只是从文件中读取并显示它,那么只需更改charwchar_t就足够了。(但在这种情况下,您可能需要考虑坚持char使用 UTF-8。)一旦您开始做更多事情,问题就会变得更加复杂:

  • 正如您所观察到的,文件名之类的东西通常必须是char. 使用 UTF-8 可以解决这个问题,但是什么字符串是合法的或不合法的仍然是一个悬而未决的问题,并且很大程度上取决于系统。

  • 解析可能会变得更加困难,具体取决于您要执行的操作。您可能不得不放弃 ; 中的简单功能<ctype.h>。C++ 具有<locale>可以与 一起使用的函数wchar_t,但它们使用起来要容易得多。虽然isspace或搜索特定分隔符或多或少地像宣传的那样工作,但诸如此类的事情toupper变得非常成问题(因为上下之间并不普遍存在一对一的关系)。

  • 以 UTF-16 或 UTF-32 读写文件时,字节序成为一个问题。无论内部使用何种类型和编码,我在char导入或导出数据时都会坚持使用 UTF-8。

总的来说,我倾向于坚持使用char, 和 UTF-8,除非我正在做重要的解析或文本操作。在这种情况下,我会查看 ICU 库,它为 UTF-16 提供了非常完整的支持。除非我 100% 确定我只需要支持一个平台,否则我会永远避免wchar_t使用没有真正标准大小或编码的 . 例如,ICU 将他们的 UTF-16 字符放在一个unsigned short. (对于 . 也可以这样说char,但 char不是 8 位的机器极为罕见,而且对于国际化,您可能遇到的唯一编码UTF-8。)

于 2013-01-31T09:06:16.507 回答