0

我从这个这个线程中了解到,在 Windows 中,wchar_t 是 16 位的,而对于 Linux,wchar_t 是 32 位的。

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

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

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

那么,将 linux 上 gethostname() 的输出转换为 char* 为 unsigned short(16 位)是我唯一的选择吗?

提前致谢!

4

2 回答 2

6

您必须决定如何通过网络传输数据的实际协议。这里有几个选项,虽然可能 UTF-8 通常是最明智的选项 - 这也意味着在 linux 下您基本上可以按原样使用数据(没有理由使用 wchar_t 开始,尽管您显然可以将其转换为您想要的任何内容想)。

在 Windows 下,您必须将 UTF-8 转换为 Windows 需要的 UTF-16(不完全是,但很好),如果您想发送数据,您必须将其转换为 UTF-8。幸运的是,windows分别为这些目的提供了这个功能

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

于 2012-11-27T20:48:01.797 回答
2

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

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

或者您可以选择 UTF-8,这将减少网络带宽,但 Windows 和 Linux 机器都必须根据需要转换为/从 UTF-8。对于网络通信,UTF-8 会是更好的选择。

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

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

于 2012-11-27T20:53:46.187 回答