使Win32应用程序在ANSI和UNICODE上运行

use*_*747 6 c++ winapi encoding

我想让我的Win32 C++应用程序能够在任何编码版本(UNICODE和ANSI)上播放.现在我有点困惑的是两个(或更多?)编码之间到底有什么区别?

为了使我的Win32应用程序交叉编码兼容,这意味着我必须通过我的代码并用std :: wstring替换每个std :: string,然后用 wchar_t*替换每个char,然后替换每个文字字符串("")用L""?

如果我的应用程序在UNICODE机器上运行并且我的应用程序中有一个std :: string会发生什么?

对于我的应用程序交叉编码兼容所需的步骤,您有什么建议吗?例如: - 将所有c_strings和字符串更改为其UNICODE等效项 - 将任何Win32函数更改为uncide版本(例如,从getenv()更改为_wgetenv())

Alo*_*ave 6

如果我的应用程序在UNICODE机器上运行并且我的应用程序中有一个std :: string会发生什么?

计算机不是ANSI或者是计算机所在Unicode的操作系统.不支持Unicode的Windows的最后一个版本是Windows 3.11 for Workgroups.如果在UniCode上运行ASCII编译的应用程序.

两个(或更多?)编码之间到底有什么区别?

什么是ASCII?
ASCII是一种七位编码技术,它为美国英语中最常使用的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-ing UNICODE_UNICODE宏支持UNICODE .反过来,这会导致程序使用Win32函数的Unicode变体.

对于我的应用程序交叉编码兼容所需的步骤,您有什么建议吗?

每个Win32函数(接受或返回一个字符串)有两个变体,一个用于ASCII,另一个用于Unicode.函数调用解析为其中之一,具体取决于是否定义了UNICODE宏.因此,您应该定义宏并开始使用Unicode版本的函数.例如:

每更换std::stringstd::wstring,
更换每char一个wchar_t*
替换每个文字string("")L""
利用的的TCHARWindows中支持等.

正如您所指出的那样,您需要注意的事项列表,请注意,这不是完整列表.

基本上,您必须在代码中使用类型和函数调用的所有Unicode版本.

  • Unicode允许大约200万个字符(2 ^ 21); 它有多个"平面",每个平面65536个字符.最常见的字符都在基本多语言平面中; 这可能是混乱的来源. (2认同)