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

3

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

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


请只返回翻译后的文本:放弃一切希望,你们进来了。 - Tom Macdonald
1
快速解决方案:您可以使用wchar_t重载函数,并在该函数中调用原始函数。 - zapredelom
1
你可以使用Unicode等效的API来替代ANSI函数,或者直接使用winapi方法http://msdn.microsoft.com/en-us/library来处理你的Unicode字符。 - Oumaya
1
@ouou 标准的 C 或 C++ 中没有 Unicode 的等价物。虽然有一些对 wchar_t 的支持,但是 wchar_t 不一定是 Unicode,并且当它是 Unicode 时,它可能是 UTF-16(Windows 和 AIX)或 UTF-32(大多数其他系统,包括 Linux)。 - James Kanze
@JamesKanze 我指的是一些API的Unicode版本,例如:wmkdir()wfopen()wsystem()...也许这个链接可以帮到你 http://www.i18nguy.com/unicode/c-unicode.html - Oumaya
显示剩余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编码,很可能大多数内容都能正常工作。

对于UTF-16和UTF-32,内部字节顺序是无关紧要的;整数类型可以正常工作。但是为了进行外部通信,您仍然需要将它们转换为UTF-8或从UTF-8转换。 - James Kanze
关于在内部使用UTF-8:大多数东西都不会起作用,因为大多数东西假定单字节编码。例如,在<ctype.h>中没有与UTF-8等效的函数。或者对于UTF-16,事实上并非所有平台都支持UTF-32,并且即使对于那些支持它的平台,等效函数也不能在所有情况下正常工作。(像toupper这样的东西仍然在代码点级别上工作,这意味着它们可能不正确。) - James Kanze

1

如果你只是从文件中读取文本并显示它,那么仅仅将char更改为wchar_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非常完整的支持。除非我百分之百确定只需要支持一个平台,否则我会避免使用wchar_t,因为它没有真正的标准大小或编码;例如,ICU将他们的UTF-16字符放在一个unsigned short中。(同样也适用于char,但是不是8位的机器极为罕见,而且为了国际化,你可能遇到的唯一编码是UTF-8。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接