我有一个使用Visual Age开发的ANSI C++项目。我想将其转换为Unicode,以便在英语操作系统中正确显示多语言字符。在定义了UNICODE
宏之后,我将所有的char
变量改为了wchar_t
。
这是正确的方法吗?源代码中有一些API只接受char*
字符串(例如system()
、fopen()
、mkdir()
)。由于代码中所有字符串都已更改为wchar_t
,那么如何使它们能够使用wchar_t
字符串呢?
我有一个使用Visual Age开发的ANSI C++项目。我想将其转换为Unicode,以便在英语操作系统中正确显示多语言字符。在定义了UNICODE
宏之后,我将所有的char
变量改为了wchar_t
。
这是正确的方法吗?源代码中有一些API只接受char*
字符串(例如system()
、fopen()
、mkdir()
)。由于代码中所有字符串都已更改为wchar_t
,那么如何使它们能够使用wchar_t
字符串呢?
UTF-8
进行编码,存储在char
字符串中UTF-16
进行编码,存储在由16位整数组成的字符串中UTF-32
进行编码,存储在由32位整数组成的字符串中。UCS-2
的较旧编码,使用此编码只能表示0x10000以下的Unicode字符。您不应该使用此编码,因为它无法表示所有的汉字。wchar_t
的宽度为2字节或4字节,因此在某些系统上,可以用它来存储UTF-16
,在其他系统上则可以存储UTF-32
字符。UTF-8
,并根据需要转换为16位或32位编码。这样可以避免字节顺序问题。UTF-8
编码,很可能大多数内容都能正常工作。<ctype.h>
中没有与UTF-8等效的函数。或者对于UTF-16,事实上并非所有平台都支持UTF-32,并且即使对于那些支持它的平台,等效函数也不能在所有情况下正常工作。(像toupper
这样的东西仍然在代码点级别上工作,这意味着它们可能不正确。) - James Kanze如果你只是从文件中读取文本并显示它,那么仅仅将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。)
wchar_t
的支持,但是wchar_t
不一定是 Unicode,并且当它是 Unicode 时,它可能是 UTF-16(Windows 和 AIX)或 UTF-32(大多数其他系统,包括 Linux)。 - James Kanzewmkdir()
、wfopen()
、wsystem()
...也许这个链接可以帮到你 http://www.i18nguy.com/unicode/c-unicode.html - Oumaya