gpt4 book ai didi

c++ - 在 C++ 流中使用 UTF-8 的正确跨平台方式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:44 24 4
gpt4 key购买 nike

据我了解 this answer to the similar question , 有一个 still unfixed bug在 Visual C++ STL 实现中。所以,不可能只写 std::cout << raw_utf8_string << std::endl并在 Windows 下享受漂亮的 UTF-8 字符 ;(

注意:我的测试程序存在 here .

但也许有一个非常简单易懂的解决方法来处理这个问题?我的想法:制作一个像 cout_ex 这样的包装类,它将使用 Windows API WriteConsoleA用于控制台输出。
在其构造函数中执行 this :

#ifdef _WIN32
if (IsValidCodePage (CP_UTF8))
{
if (!SetConsoleCP (CP_UTF8))
std::cout << "Could not set console input code page to UTF-8" << std::endl;
if (!SetConsoleOutputCP (CP_UTF8))
std::cout << "Could not set console output code page to UTF-8" << std::endl;
}
else
std::cout << "UTF-8 code page is not supported in your system" << std::endl;
#endif

在输出方法中这样做:

char const raw_utf8_text[] = "Blåbærsyltetøy! кошка!";

DWORD raw_written = 0;
WriteConsoleA (GetStdHandle (STD_OUTPUT_HANDLE), raw_utf8_text, std::strlen (raw_utf8_text), &raw_written, NULL);

并且不要忘记在 src 的开头使用未记录的 Visual C++ 编译指示:

#pragma execution_character_set("utf-8")

但也许有人有更明确的解决方案 :) 即使使用一些外部库,如 Poco/Boost 等。

我尝试阅读那些文章 1 , 2 ,但我发现这种方式太复杂了。附言重写的流类也应该将控制台字体设置为 Unicode 字体。
附言软件版本:Windows 8 x64 + Visual C++ 2013 Express。

最佳答案

您应该在输出流中注入(inject)适当的 codecvt_facet。

std::locale loc;
string encoding=getOutputEncoding(); //
loc=std::locale(loc, createCodecvt(encoding));
cout.imbue(loc);
cout.rdbuf().imbue(loc);

Complete code here

此方面应将内部编码转换为外部编码。由于some bugs在 STL 实现中,如果内部存储格式是单字节或多字节编码,这可能是不可能的。有一个解决方法 - 使用 filestreambuf 而不是默认输出缓冲区。

您可能需要实现自己的 codecvt_facet 或使用我的 iconv wrapper .

总体来说我还是推荐使用宽字符进行内部处理。这样您甚至可以避免任何额外的转换(系统默认转换除外)。

关于c++ - 在 C++ 流中使用 UTF-8 的正确跨平台方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23584160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com