如何将 ANSI 项目转换为 UNICODE 项目

How to convert a ANSI project into a UNICODE one?

本文关键字:项目 转换 UNICODE ANSI      更新时间:2023-10-16

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

这是正确的方法吗?源代码中有一些 API 只接受char*字符串(如 system()fopen()mkdir())。我怎样才能使它们使用wchar_t字符串,因为代码中的所有字符串都变成了wchar_t

有几种表示 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编码,大多数东西都会起作用。

不知道你在做什么就很难说文本,以及它的来源。 如果你所做的只是阅读它来自文件并显示它,然后只需char更改为 wchar_t可能就足够了。 (但在这种情况下,您可能希望考虑坚持使用 char ,并使用 UTF-8。 一旦你开始做得更多,问题变得更加复杂:

  • 正如您所观察到的,文件名之类的东西通常会有要char. 使用 UTF-8 可以解决此问题,有点,但是哪些字符串是合法的,哪些是不合法的仍然是一个开放问题,并且在很大程度上取决于系统。

  • 解析可能会变得更加困难,具体取决于您要的内容努力做。 您可能不得不放弃简单的功能在<ctype.h> ;C++具有<locale>的功能,您可以与wchar_t一起使用,但它们不太容易使用。 和在isspace或搜索特定分隔符时工作更多或不像宣传的那样,像toupper这样的事情变得非常有问题(因为没有普遍的一对一上下关系)。

  • 读取和写入 UTF-16 或 UTF-32 文件时,字节序成为一个问题。 无论使用的类型和编码如何在内部,char每当我导入或导出数据。

总的来说,我倾向于坚持使用 char 和 UTF-8,除非我正在进行重要的解析或文本操作。 其中案例,我会查看 ICU 图书馆,它提供了非常完全支持 UTF-16。 除非我 100% 确定我只需要支持一个平台,永远,我会避免wchar_t,它没有真正的标准大小或编码;例如,ICU 将其 UTF-16 字符放在一个 unsigned short . (对于char也可以这样说,但是机器 char不是 8 位是非常罕见的,对于国际化,关于您可能进行的唯一编码遭遇 UTF-8。