c++ wchar_t数组和char数组在win32控制台编程中的应用



我正在写一个程序,包括使用Dev c++输出中文字符。

我补充道-finput-charset =繁体-fexec-charset =繁体在编译器参数中。我还将控制台的代码页设置为950(繁体中文)

在像这样的简单代码中,它可以完美地工作:

cout << "中文字";

当涉及到字符数组时,它会像预期的那样出错:

char chin[] = "中文字"; 
cout << chin[0];//output nothing
cout << chin[0] << chin[1];//output the first chinese character as one chinese character occupies 2 bytes.

所以我决定使用wchar_t代替,我必须使用wcout与wchar_t,否则将显示一个数字。

但是,我们在控制台中没有显示任何内容。

wcout << L"中文字";
wchar_t chin2[] = L"中文字";
wcout << chin2[0]; 

我错过了什么使用wchar_t输出中文(或其他东亚)字符?我真的不想写两个数组成员来显示一个中文字符。

这里有一些微妙的问题。

c++编译器不理解Big5编码。当您创建源代码文件并显示它时,您可能会看到熟悉的中文字符,但编译器看到的是一串字节。Big5是一个双字节字符集,因此每个输入字符将在编译器内用2个字节表示。

当该字节串被输入到合适的输出设备时,中文字符再次出现。代码页950与Big5兼容,所以你看到的是"正确"的东西。但如果你试图以此为基础,结果就是混乱。第二个代码示例使用L"字符串,但我希望这些字符串在每个短字符中包含半个字符。

唯一可以使用的"安全"字符集是Unicode。Windows内部历史上是UCS-2 (char是一个短字符),但现在理论上是UTF-16 (char是短字符,但可能包括多字节序列)。并非所有现有软件和较旧的api都完全支持(或需要)UTF-16。Windows对UTF-8或其他编码的支持非常有限。所有内容都被转换为Unicode,所以最好保持这种方式。

在实践中,您应该使用Unicode设置构建c++代码,对于UCS-2,并且如果您需要需要多字节序列的字符,请谨慎操作。您应该确保您编写的任何源代码和任何输入文本文件都被标识为它们需要的编码,但在内部被转换为Unicode。让您的控制台作为默认的Unicode编码,一切都会正常工作。

在Windows程序中使用Big5作为内部编码几乎是不可能的。最好不要尝试。

最新更新