【发布时间】:2010-12-12 05:48:37
【问题描述】:
以下代码在我的机器上显示了意外行为(在 Windows XP 上使用 Visual C++ 2008 SP1 和在 Windows 7 上使用 VS 2012 进行了测试):
#include <iostream>
#include "Windows.h"
int main() {
SetConsoleOutputCP( CP_UTF8 );
std::cout << "\xc3\xbc";
int fail = std::cout.fail() ? '1': '0';
fputc( fail, stdout );
fputs( "\xc3\xbc", stdout );
}
我只是用cl /EHsc test.cpp编译。
Windows XP: 控制台窗口中的输出是
ü0ü(翻译为代码页1252,最初显示一些线条图
默认代码页中的字符,可能是 437)。当我更改设置时
控制台窗口使用“Lucida Console”字符集并运行我的
再次test.exe,输出变为1ü,意思是
- 字符
ü可以使用fputs及其UTF-8 编码C3 BC编写 -
std::cout无论出于何种原因都不起作用 -
failbit在尝试写入字符后正在设置流
Windows 7: 使用 Consolas 的输出是 ��0ü。更有趣的是。可能写入了正确的字节(至少在将输出重定向到文件时)并且流状态正常,但两个字节被写入为单独的字符。
我试图在“Microsoft Connect”上提出这个问题(参见here), 但 MS 并没有太大帮助。你不妨看看here 以前有人问过类似的问题。
你能重现这个问题吗?
我做错了什么? std::cout 和 fputs 不应该相同吗
效果?
已解决:(有点)按照 mike.dld 的想法,我实现了一个 std::stringbuf,在 sync() 中进行从 UTF-8 到 Windows-1252 的转换,并替换了 std::cout 的流缓冲区使用此转换器(请参阅我对 mike.dld 答案的评论)。
【问题讨论】:
-
我以前在使用 c++ iostreams 时遇到过问题。有很多隐藏的讨厌会导致问题。这不值得回答,但是当 iostreams 给您带来麻烦时,请使用 c 的 stdio,我以前曾多次遇到过类似的问题。
-
是的,使用 iostreams 比 stdio 更复杂,甚至有 full-length text books 关于这个。但是 iostreams 为您提供了很大的灵活性,我很乐意使用它。
-
这不是 Windows 控制台的问题吗?我记得它无论如何都不知道 unicode,造成了很多这样的问题......
-
如您所见,我可以在 Windows 控制台中输出 UTF-8 编码的字符串(通过
fputs),我可以使用 @987654340 输入 UTF-8 编码的文件@ 命令(在完成chcp 65001之后)。因此我认为它可以处理这种编码......
标签: c++ visual-studio-2008 utf-8 windows-xp console