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

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

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

我已经添加了 -finput-charset=big5 -fexec-字符集=big5 在编译器参数中。我还设置了控制台的代码页为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 个数组成员来显示一个中文字符。

最佳答案

这里有一些微妙的问题。

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 作为内部编码几乎是不可能的。最好不要尝试。

关于c++ wchar_t数组和char数组在win32控制台编程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25011802/

相关文章:

javascript - Node.JS - filter() 仅在索引中进行硬编码时才起作用

c - 宽字符字符串文字

string - 是否可以在 C++/CLI 中获得指向 String^ 内部数组的指针?

c++ - 正则表达式驱动的 while 循环没有正确循环

c++ - 检测某些整数是否具有特定值的位技巧

c++ - 函数参数在 64 位操作系统的寄存器中传输?

c++ - C++ 应用程序中的静态数据内存限制

带有方括号而不是圆括号的 JavaScript 数组 `push` - 没有错误?

c++ - 当需要数组时,将指针传递给 vector 中的第一个元素是否安全?

winapi - 将 unicode 字符串转换为 wchar_t