putwchar / getwchar编码?

时间:2011-10-03 19:45:49

标签: c linux winapi unicode posix

我正在编写可在Windows和Linux上运行的代码。该应用程序使用unicode字符串,我希望使用公共代码将它们输出到控制台。

putwchar和getwchar会不会这样做?例如,我可以为这些函数提供unicode字符值,它们是否会在Linux和Windows上显示相同的字符?

3 个答案:

答案 0 :(得分:3)

你即将进入痛苦的世界。 * nix控制台总是喜欢向他们发送UTF-8编码的char *数据。

另一方面,Windows使用UTF-16作为其Unicode API和控制台API,我认为它仅限于UCS2。

您可能需要找到一些库代码,以便为您提取差异。我没有给你很好的建议,但我确信putwchargetwchar不是解决方案。

答案 1 :(得分:2)

协调它们的众多方法之一是在Windows中使用显式转换模式:

#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
int main()
{
#ifdef _WIN32
   _setmode(_fileno(stdout), _O_WTEXT);
#else
    setlocale(LC_ALL, "en_US.UTF-8");
#endif
   fputws(L"Кошка\n", stdout);
}

在Linux上使用gcc 4.6.1和在Windows上使用Visual Studio 2010进行测试

还有_O_U8TEXT_O_U16TEXT in Windows。您的里程可能会有所不同。

答案 2 :(得分:0)

请参阅Linux上的putwchar手册页。它表示行为取决于LC_CTYPE并说“有理由期望putwchar()实际上会写出与宽字符wc相对应的多字节序列。”同样,getwchar()应从标准输入读取多字节序列,并将其作为宽字符返回。

不要假设它们会像在UCS2中那样读/写一个恒定的字节数。

所有这一切,逐个字符的I / O通常不是最快的解决方案,当你开始优化时,请记住在Linux和Unix上你将使用UTF-8。