我正在编写可在Windows和Linux上运行的代码。该应用程序使用unicode字符串,我希望使用公共代码将它们输出到控制台。
putwchar和getwchar会不会这样做?例如,我可以为这些函数提供unicode字符值,它们是否会在Linux和Windows上显示相同的字符?
答案 0 :(得分:3)
你即将进入痛苦的世界。 * nix控制台总是喜欢向他们发送UTF-8编码的char *数据。
另一方面,Windows使用UTF-16作为其Unicode API和控制台API,我认为它仅限于UCS2。
您可能需要找到一些库代码,以便为您提取差异。我没有给你很好的建议,但我确信putwchar
和getwchar
不是解决方案。
答案 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。