gpt4 book ai didi

c++ - 为什么 `getline` 上的 `wifstream` 从 UTF-16 编码文件读取乱码输入?

转载 作者:IT王子 更新时间:2023-10-29 00:37:56 25 4
gpt4 key购买 nike

尝试读取带有来自 this answer 的提示的 UTF-16 编码文件时,我遇到的问题是,在读取几千个字符后,getline-方法开始读取垃圾 mojibake。

这是我的主要内容:

#include <cstdio>
#include <fstream>
#include <iostream>
#include <codecvt>
#include <locale>

int main(void) {

std::wifstream wif("test.txt", std::ios::binary);
setlocale(LC_ALL, "en_US.utf8");
if (wif.is_open())
{
wif.imbue(
std::locale(
wif.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>
)
);

std::wstring wline;
while (std::getline(wif, wline))
{
std::wcout << wline;
}

wif.close();
}

return 0;
}

test.txt文件包含FFFE字节顺序标记,后面是100行80个'a' 每行。这是一个在 *nix 上生成 test.txt 的 bash 脚本:

#!/bin/bash

echo -n -e \\xFF\\xFE > test.txt
for i in $(seq 1 100)
do
for i in $(seq 1 80)
do
echo -n -e \\x61\\x00 >> test.txt
done
echo -n -e \\x0A\\x00 >> test.txt
done

下面是我如何编译和运行主程序:

g++-8 -std=c++17 -g main.cpp -o m && ./m

我的预期:打印了 8000 个 'a'

实际发生了什么:

在打印了几千个a之后,输出变为以下垃圾:

aaaaaaaaaa愀愀愀愀愀愀愀愀愀愀

有时不可打印的字符看起来像矩形中的 0A00

-字符的二进制代码点值为 110000100000000,所以它看起来像 a-byte 后跟 0-字节。

似乎在读取过程中丢失了一些字节,从那时起,一切都错位了,所有剩余的符号都被错误地解码了。或者,因为输出以 0A00-thingie 结尾,可能是在读取几千个 a 之后字节顺序被颠倒了,但这种行为也不会产生任何影响有什么感觉。

为什么会发生这种情况,最简单的解决方法是什么?

最佳答案

一个简单的解决方法(但不是通用的解决方案)

如果您确定输入文件具有特定的字节顺序,那么您可以简单地硬编码字节顺序 as shown in the example in the documentation :

        wif.imbue(
std::locale(
wif.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>
)
);

使用硬编码的 std::little_endian,问题似乎消失了,文件被正确读取。它可能不适用于具有相反字节顺序的文件。

关于c++ - 为什么 `getline` 上的 `wifstream` 从 UTF-16 编码文件读取乱码输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55908465/

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