我从this和this线程了解到,在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位)是我唯一的选择吗?
提前致谢!
答案 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字符集。