我正在用 C++ 编写一个跨平台应用程序。所有字符串均在内部进行 UTF-8 编码。考虑以下简化代码:
#include <string>
#include <iostream>
int main() {
std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
std::cout << test;
return 0;
}
在 Unix 系统上,std::cout
期望 8 位字符串采用 UTF-8 编码,因此此代码可以正常工作。
然而,在 Windows 上,std::cout
期望 8 位字符串采用 Latin-1 或类似的非 Unicode 格式(取决于代码页)。这将导致以下输出:
希腊语:╬▒╬▓╬│╬┤;德语: ├£bergr├Â├ςentr├ñger
我能做些什么来使std::cout
在 Windows 上将 8 位字符串解释为 UTF-8?
这是我尝试过的:
#include <string>
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main() {
_setmode(_fileno(stdout), _O_U8TEXT);
std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
std::cout << test;
return 0;
}
我本来希望_setmode
就可以了。但是,这会导致调用行中出现以下断言错误operator<<
:
Microsoft Visual C++ 运行时库
调试断言失败!
程序:d:\ Visual Studio 2015 \ Projects \ utf8test \ Debug \ utf8test.exe
文件:minkernel\crts\ucrt\src\appcrt\stdio\fputc.cpp
线路:47
表达式: ( (_Stream.is_string_backed()) || (fn = _fileno(_Stream.public_stream()), ((_textmode_safe(fn) == __crt_lowio_text_mode::ansi) && !_tm_unicode_safe(fn))))
有关您的程序如何引发断言的信息
失败,请参阅有关断言的 Visual C++ 文档。