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

时间:2014-07-29 09:12:11

标签: c++ arrays wchar-t chinese-locale

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

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

在这样一个简单的cout中它完美地运作:

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在控制台中没有显示任何内容。以下所有内容均未显示:

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

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

1 个答案:

答案 0 :(得分:0)

这里有微妙的问题。

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

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

您可以使用的唯一“安全”字符集是Unicode。 Windows内部历史上是UCS-2(char是单个短)但现在理论上是UTF-16(char很短,但可能包括多字节序列)。并非所有现有软件和旧API都完全支持UTF-16(或需要)。 Windows对UTF-8或其他编码的支持非常有限。所有东西都被转换成Unicode,所以最好留下它。

实际上,对于UCS-2,您应该使用Unicode设置构建C ++代码,如果需要需要多字节序列的字符,请务必小心。您应该确保您编写的任何源代码和任何输入文本文件都被标识为它们需要的任何编码,但在内部被转换为Unicode。将您的控制台保留为默认的Unicode编码,一切都会正常工作。

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