我从了解这个和这个线程在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位),我唯一的选择?
提前致谢!
你必须对如何通过线路传输数据的实际协议决定。 这里有几个选项虽然可能UTF-8通常是最明智的 - 也即意味着在Linux下你基本上可以只使用数据原样(没有理由使用wchar_t的,首先,虽然你明明可以把它转换成任何你想)。
在Windows下,你必须将UTF-8转换为UTF-16(是不完全的,但很好哦),它的窗户想,如果你要发送的数据,你必须将其转换为UTF-8。 幸运的是,Windows提供这种分别此功能正是这些目的。
很明显,你可以在你想一定不是UTF-8编码的任何决定,这个过程是相同的:当接收数据时将其转换为操作系统的本机格式,发送转换为你上线时编码。 的iconv在Linux上工作,如果你不使用UTF-8。
你是最好的选择断供您送在管道中的数据标准的字符编码,然后要求所有的机器使用的编码发送他们的数据。
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字符集编码/解码。