如果我的应用程序在UNICODE机器上运行,并且我的应用程序中有一个std::string,会发生什么?
计算机本身不是ANSI或Unicode编码的,而是计算机操作系统所支持的。最后一个不支持Unicode的Windows版本是Windows 3.11 for Workgroups。如果您在Unicode上运行ASCII编译的应用程序。
这两种(或更多?)编码之间到底有什么区别?
什么是ASCII?
ASCII是一种7位编码技术,为美国英语中最常用的128个字符分配一个数字。这使得大多数计算机可以记录和显示基本文本。ASCII不包括其他国家经常使用的符号。
什么是Unicode?
ASCII的一个主要缺点是你只能拥有256个不同的字符。然而,像日语和阿拉伯语这样的语言有成千上万个字符。因此,ASCII在这些情况下无法使用。结果是Unicode,允许高达65,536个不同的字符。
Unicode是ISO和Unicode Consortium开发电子文本编码系统的一种尝试,其中包括所有现有的书写字母表。根据特定表示方式,Unicode使用8位、16位或32位字符,因此Unicode文档通常需要比ASCII或Latin-1文档多一倍的磁盘空间。Unicode的前256个字符与Latin-1完全相同。
在Win32中,通过#define定义UNICODE和_UNICODE宏来支持UNICODE。这反过来会使您的程序使用Win32函数的Unicode变体。
你有什么建议,我需要采取哪些步骤使我的应用程序跨编码兼容?
每个Win32函数(接受或返回字符串)都有两个变体,一个用于ASCII,一个用于Unicode。函数调用解析为其中之一,具体取决于是否定义了UNICODE宏。因此,您应该定义宏并开始使用函数的Unicode版本。例如:
将每个std::string替换为std::wstring,
将每个char替换为wchar_t*
将每个文字字符串("")替换为L""
利用Windows中的TCHAR支持等。
正如您指出的那样,这是您需要注意的事项列表,但请注意,这不是完整的列表。
基本上,您将必须在代码中使用所有类型和函数调用的Unicode版本。