- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个文件,行尾是windows风格的\r\n
;它以 USC-2 little endian 编码。
假设这是我的文件 fruit.txt
(USC-2 little endian):
所以我在 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++ 中打开它,这就是它的样子
我可以通过强制将编码转换回 USC-2 来纠正这个问题,结果是:
我的 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/
所以我正在尝试使用 python 和 tweepy 包制作一个 Twitter 机器人。但是,我不断收到 UnicodeEncodeError。发生错误是因为 python 无法读取/理解传递到我通过
我正在尝试在简单的 C 程序中运行嵌入的 Python。但是,当我导入模块时,出现错误 undefined symbol :PyUnicodeUCS2_DecodeUTF8。 经过进一步调查,我发现在
我有一个文件,行尾是windows风格的\r\n;它以 USC-2 little endian 编码。 假设这是我的文件 fruit.txt(USC-2 little endian): 所以我在 st
在此链接中http://msdn.microsoft.com/en-us/library/azure/dn741328.aspx ,图表包括对“USC”和“TDS”的引用。我猜测 TDS 代表表格数据
我是一名优秀的程序员,十分优秀!