【发布时间】:2015-12-04 11:17:12
【问题描述】:
在 Windows 中,有像 mbstowcs 这样的函数可以在 char 和 wchar_t 之间进行转换。还有from_bytes<std::codecvt<wchar_t, char, std::mbstate_t>>等C++函数可以使用。
但是在 char 和 wchar_t 显然大小不同的情况下,这如何工作?我假设系统代码页以某种方式涉及?但是如果 wchar_t 不能与 char 相关联会发生什么(它毕竟可以包含更多的值)?
如果必须使用 char 的代码(可能是由于库)在具有不同代码页的计算机之间移动,会发生什么情况?假设它只使用在 ASCII 范围内的数字(0-9),那总是安全的吗?
最后,在本地语言不能用 256 个字符表示的计算机上会发生什么?在这种情况下,char 的概念似乎与存储(例如 utf8)完全无关。
【问题讨论】:
-
But what happens if a wchar_t can't be correlated to a char (it can after all contain a lot more values)?这正是需要担心的事情。真正的答案是“不要转换为字符”。如果您有 wchar_t / UTF16 数据并且不想丢失内容,请保持原样。 (当然还有其他编码可以无损转换,但通常默认的一字节编码不在其中) -
Microsoft 的mbstowcs 的最后一个参数是locale,它控制如何执行转换。 Standard one 使用 setlocale。这些都是病态的。任何强大的应用程序中的国际化都应由专用 (Unicode) 库(icu、Qt、boost、...)处理
-
关于另外两个问题,同样,不要将 unicode 编码下转换为某种 256 值编码。
-
请注意,仅仅因为 Windows API 假定
chars 位于系统代码页中,这并不意味着chars 始终存在。例如,某些库可能会假设它们是 UTF-8,并且可以从wchar_t(在 Windows 上为 UTF-16)转换为 UTF-8。 -
@Drop:icu Qt 和 boost 将归结为标准函数,否则它们本身不会“健壮”。它们是用于定义标准必须是什么的标准前实现,并且也将通过标准实现
标签: c++ windows character-encoding