差异与wchar_t的之间的转换为Linux和Windows(Difference and conv

2019-11-01 06:28发布

我从了解这个和这个线程在Windows,wchar_t的是16位和适用于Linux,wchar_t的是32位。

我有一个客户端 - 服务器架构(只使用管道 - 而不是套接字) - 在我的服务器是基于Windows和客户端是Linux操作系统。

服务器有一个API来从客户端获取主机名。 当客户端基于Windows,它可能只是做GetComputerNameW并返回宽字符串。 但是,客户端是基于Linux的时候,事情变得复杂。

作为第一个幼稚的做法,我用mbstowcs()希望* wchar_t的返回到Windows服务器端。 然而,由于预计其wchar_t的是16位这个LPWSTR(我有我的Linux客户为例侧的typedef为wchar_t * LPWSTR)不是Windows识别。

因此,将在Linux上的gethostname()的输出 - 这是在字符*为unsigned短(16位),我唯一的选择?

提前致谢!

Answer 1:

你必须对如何通过线路传输数据的实际协议决定。 这里有几个选项虽然可能UTF-8通常是最明智的 - 也即意味着在Linux下你基本上可以只使用数据原样(没有理由使用wchar_t的,首先,虽然你明明可以把它转换成任何你想)。

在Windows下,你必须将UTF-8转换为UTF-16(是不完全的,但很好哦),它的窗户想,如果你要发送的数据,你必须将其转换为UTF-8。 幸运的是,Windows提供这种分别此功能正是这些目的。

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



Answer 2:

你是最好的选择断供您送在管道中的数据标准的字符编码,然后要求所有的机器使用的编码发送他们的数据。

Windows使用UTF-16LE,所以你可以选择在管道上使用UTF-16LE,然后Windows机器可以把他们的UTF-16LE编码字符串原样,但Linux机器将不得不需要转换到/自UTF-16LE。

或者你也可以选择UTF-8,而不是,这将减少网络带宽,但Windows和Linux的机器将不得不为neded从UTF-8转换到/。 对于网络通信,UTF-8将是更好的选择。

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

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



文章来源: Difference and conversions between wchar_t for Linux and for Windows