gpt4 book ai didi

c++ - 如何正确地将 USC-2 little endian 转换为 UTF-8?

转载 作者:行者123 更新时间:2023-11-30 05:14:41 26 4
gpt4 key购买 nike

我有一个文件,行尾是windows风格的\r\n;它以 USC-2 little endian 编码。

假设这是我的文件 fruit.txt(USC-2 little endian):

input file

所以我在 std::wifstream 中打开它并尝试解析内容:

// open the file
std::wifstream file("fruit.txt");
if( ! file.is_open() ) throw std::runtime_error(std::strerror(errno));

// create container for the lines
std::forward_list<std::string> lines;

// Add each line to the container
std::wstring line;
while(std::getline(file,line)) lines.emplace_front(wstring_to_string(line));

如果我尝试打印 cout...

// Printing to cout
for( auto it = lines.cbegin(); it != lines.cend(); ++it )
std::cout << *it << std::endl;

...这是它的输出:

Cherry
Banana
ÿþApple

更糟糕的是,如果我在 Notepad++ 中打开它,这就是它的样子

Null characters everywhere

我可以通过强制将编码转换回 USC-2 来纠正这个问题,结果是:

enter image description here

我的 wstring_to_string 函数定义如下:

std::string wstring_to_string( const std::wstring& wstr ) {
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
return convert.to_bytes(wstr);
}

这到底是怎么回事?如何获得普通的 UTF-8 字符串?我也试过这个方法:How to read utf-16 file into utf-8 std::string line by line , but 注入(inject) std::wifstream 首先导致完全没有输出。有人可以指导我以最佳方式将 USC-2 LE 数据转换为可读的 UTF-8 数据吗?

编辑 我认为 MSYS2 提供的 mingw64/mingw-w64-x86_64-gcc 6.3.0-2 可能存在错误。我已经尝试了每个人的建议,将语言环境注入(inject)流中只是根本没有输出。我知道只提供了两个本地语言环境,“C”和“POSIX”。我打算尝试 Visual Studio,但没有足够的互联网速度来下载 4GB。我已经像@Andrei R. 建议的那样使用了 ICU,并且效果很好。

我很想使用标准库,但我同意这一点。如果您需要此解决方案,请查看我的代码:https://pastebin.com/qudy7yva

最佳答案

代码本身没有问题。

真正的问题是您的输入文件不是有效的 UTF-16LE(您对 std::codecvt_utf8_utf16 的使用需要 UTF-16,而不是 UCS-2)。这清楚地显示在您的 Notepad++ 屏幕截图中。

顺便说一句,文件数据看起来像一个带有 BOM 的 UTF-16LE 文件(ÿþ 是 UTF-16LE BOM,当被视为 8 位 ANSI 时)被原样 到没有 BOM 的 UCS-2BE(或 UTF-16BE)文件的末尾。

您需要修复输入文件,使整个文件从头到尾都是有效的 UTF-16LE(前面有或没有 BOM,中间没有)。

然后您已有的代码将起作用。

关于c++ - 如何正确地将 USC-2 little endian 转换为 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43359132/

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