我正在编写一个包含使用Dev C ++输出中文字符的程序。
我已经添加
-finput-charset = big5
-fexec-charset = big5
在编译器参数中。我还将控制台的代码页设置为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在控制台中什么也不显示。以下所有内容均未显示:
wcout << L"中文字";
wchar_t chin2[] = L"中文字";
wcout << chin2[0];
我错过了使用wchar_t输出中文(或其他东亚)字符的原因?我真的不想写2个数组成员来显示一个中文字符。
最佳答案
这里有一些细微的问题。
C ++编译器不了解Big5编码。创建源代码文件并显示它时,您可能会看到熟悉的中文字符,但编译器会看到一个字节字符串。 Big5是一个双字节字符集,因此每个输入字符将在编译器内部由2个字节表示。
当该字节字符串输入到合适的输出设备时,中文字符再次出现。代码页950与Big5兼容,因此您看到了“正确的”东西。但是,然后您尝试在此基础上继续进行,结果就是混乱。您的第二个代码示例使用L“”字符串,但是我希望这些字符串在每个short中都包含一半字符。
您可以使用的唯一“安全”字符集是Unicode。 Windows内部结构从历史上讲是UCS-2(char是一个简短的表示),但从理论上讲现在是UTF-16(char是一个简短的表示,但可能包括多字节序列)。并非所有现有软件和较旧的API都完全支持(或需要)UTF-16。 Windows对UTF-8或其他编码的支持非常有限。一切都将转换为Unicode,因此最好以这种方式保留。
实际上,对于UCS-2,应该使用Unicode设置来构建C ++代码,如果需要的字符需要多字节序列,则应谨慎行事。您应该确保将您编写的任何源代码和任何输入文本文件标识为所需的任何编码,但在内部将其转换为Unicode。将您的控制台保留为默认的Unicode编码,一切将正常进行。
在Windows程序中明智地使用Big5作为内部编码几乎是不可能的。最好不要尝试。