wchar_t for Linux和Windows之间的差异和转换

时间:2012-11-27 20:37:16

标签: c++ visual-c++ g++ wchar

我从thisthis线程了解到,在Windows中,wchar_t是16位&对于Linux,wchar_t是32位。

我有一个客户端 - 服务器架构(仅使用管道 - 而不是套接字) - 我的服务器是基于Windows的,客户端是Linux。

服务器有一个API可以从客户端检索主机名。当客户端基于Windows时,它可以只执行GetComputerNameW并返回Wide-String。 但是,当客户端基于Linux时,事情会变得混乱。

作为第一个天真的方法,我使用mbstowcs()希望将wchar_t *返回到Windows服务器端。 但是,这个LPWSTR(我的linux clinet端有typedef wchar_t * LPWSTR)在Windows上无法识别,因为它期望它的wchar_t是16位。

那么,将linux上的gethostname()输出转换为无符号短(16位)是我唯一的选择吗?

提前致谢!

2 个答案:

答案 0 :(得分:6)

您必须决定如何通过网络传输数据的实际协议。这里有几个选项,虽然可能是UTF-8通常是最明智的 - 也就是说,在Linux下你基本上只是按原样使用数据(没有理由使用wchar_t开头,虽然你显然可以把它转换成你的任何你要)。

在Windows下,您必须将UTF-8转换为UTF-16(是的,不完全,但是很好),Windows需要哪些,如果要发送数据,则必须将其转换为UTF-8。幸运的是,窗口分别提供了this this函数用于这些目的。

显然你可以决定你想要的任何编码不一定是UTF-8,过程是相同的:当接收数据时将其转换为操作系统的本机格式,当发送时将其转换为你的在线编码。如果你不使用utf-8,iconv适用于linux。

答案 1 :(得分:2)

您最好为通过管道发送的数据选择标准字符编码,然后要求所有计算机使用该编码发送数据。

Windows使用UTF-16LE,因此您可以选择在管道上使用UTF-16LE,然后Windows机器可以按原样发送其UTF-16LE编码字符串,但Linux机器必须转换为UTF-16LE /从UTF-16LE转换根据需要。

或者您可以选择UTF-8,这会降低网络带宽,但Windows和Linux机器都必须转换为UTF-8。对于网络通信,UTF-8将是更好的选择。

在Windows上,您可以将MultiByteToWideChar()WideCharToMultiByte()CP_UTF8代码页一起使用。

在Linux中,使用iconv() API,以便为编码/解码指定UTF-8字符集。