gpt4 book ai didi

c++ - Unicode 字符不读 - C++

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:56 25 4
gpt4 key购买 nike

我有一段简单的代码可以打开文件流并打印出内容。一旦遇到 unicode 字符,它就会停止读取。

我的系统设置为日语语言环境,Visual Studio 设置为编译为 unicode。不确定发生了什么。

文件:

<abc \ 单位孤>hajslklfasjflkesjfleajflj

文件十六进制转储:

EF BB BF 3C 61 62 63 20 5C 20 E5 8D 95 E4 BD 8D
E5 AD A4 3E 68 61 6A 73 6C 6B 6C 66 61 73 6A 66
6C 6B 65 73 6A 66 6C 65 61 6A 66 6C 6A 0D 0A

代码部分:

std::wifstream fin(path, std::ios::binary);
fin.imbue(std::locale(fin.getloc(), new std::codecvt_utf8_utf16<wchar_t, 0x10ffff, std::consume_header>));
if (!fin.good()) return;

while (fin.good()) {
std::wcout << (wchar_t)fin.get() << "\n";
}

fin.close();

输出:

Output

最佳答案

读起来还好,就是写不好。

std::wcout << (wchar_t)fin.get() << "\n";

不幸的是,std::wcout 实际上并不能可靠地将 Unicode 发送到终端。

虽然 Windows 终端本身以 UTF-16 代码单元工作,但 std::wcout 仍然以纯粹基于字节的术语定义。它使用特定于语言环境的默认编码将其宽输入向下转换为字节,然后再写入良好的旧 Unicode 无知字节标准输出流(毕竟这可能是 native 字节文件重定向以及 native Unicode 终端输出) .

因此 std::wcout 最终在 Windows 下与所有其他字节 IO 接口(interface)一样受到限制,仅限于当前代码页中的字符。您的代码页可能是 932,其中字符 U+5355 不存在,因此尝试写入它会中断流。

由于基本 C 运行时中的各种多字节字符计数错误,将当前代码页设置为 65001 以尝试获得所有其他现代平台喜欢的相同 UTF-8 输出并不完全有效。 MS 已经为许多多个版本打破了这一点,因此希望 UTF-8 在 Windows 下仍然是二等公民。

一些备选方案:

  1. 使用 Win32 WriteConsoleW API 而不是 stdlib 接口(interface)。 (需要小心处理可能的输出重定向,如果您需要您的项目跨平台兼容。)

  2. 使用 _setmode_O_U16TEXT 将输出流更改为 UTF-16 编码字节。请参阅 this question 中的示例.似乎并非所有接口(interface)都必须在这种模式下工作;如果您尝试同时使用字节接口(interface),您可能会遇到麻烦。

  3. 输出明确的 UTF-8 编码字节,并要求 Windows 控制台用户只能忍受由此产生的拼写和缺失字形。

很遗憾这个故事仍然如此悲惨。

关于c++ - Unicode 字符不读 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28706426/

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