不同平台上的wchar_t编码

4

我在不同平台(我这里是Windows和Linux)上遇到了编码问题。在Windows上,wchar_t的大小为2个字节,而在Linux上为4个字节。如何“标准化”wchar_t以使它在两个平台上具有相同的大小?如果没有额外的库,实现起来难吗?目前,我正在使用printf/wprintf API。数据通过套接字通信发送。谢谢。


2
你可以使用 wchar_t 做的有用的事情不具备可移植性,而你可以使用 wchar_t 做的可移植的事情又没有什么用。抱歉,请使用其他方法。 - Dietrich Epp
2个回答

3

如果您想在不同平台和架构之间发送Unicode数据,我建议使用UTF-8编码和(8位)char。 UTF-8具有一些优点,例如没有字节序问题(UTF-8只是一个纯粹的字节序列,而UTF-16和UTF-32可以是小端或大端...)。

在Windows上,只需在Win32 API的边界处将UTF-8文本转换为UTF-16(因为Windows API通常使用UTF-16)。 您可以使用MultiByteToWideChar() API来执行此操作。


1
请访问http://www.utf8everywhere.org/以获取更详细的讨论,了解为什么这是正确的答案。 - Dietrich Epp
谢谢,我在想为什么我没能想到这个,呵呵。问题已解决 :-) - user2399415

0
为了解决这个问题,我认为你需要在传输之前将所有字符串转换为UTF-8。在Windows上,您可以使用WideCharToMultiByte函数将wchar_t字符串转换为UTF-8字符串,并使用MultiByteToWideChar将UTF-8字符串转换为wchar_t字符串。
在Linux上,情况并不那么简单。您可以使用wctombmbtowc函数,但它们转换的内容取决于底层区域设置。因此,如果您希望将它们转换为/从UTF-8和Unicode,则需要确保区域设置使用UTF-8编码。 本文也可能是一个很好的资源。

在Linux上,您可以使用iconv_open("UTF-8", "WCHAR_T")打开一个iconv()转换描述符,将wchar_t字符串转换为UTF-8字符串(反之亦然)。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接