gpt4 book ai didi

c++ - unicode "aware"std::getline

转载 作者:行者123 更新时间:2023-11-28 06:47:01 28 4
gpt4 key购买 nike

好吧,我正在测试如何编写一个 C++ 应用程序,它实际上可以读取(和更改)文本文件,同时遵守用于文本的编码。我希望(对于其他 API)将所有读取的文本显式转换为 UTF-8 以供内部使用。与文件中的实际编码无关。

我在 Windows 上测试使用“ansi”“UTF-8”编码的文本文件(这些似乎工作正常)。然后“unicode big endian”不起作用; std::getline 结果似乎是原始字节数组,没有将文件(UTF-16??)转换为 UTF-8。

我怎样才能强制执行此操作?我事先不知道文件是用什么编码的。使用的代码:

std::string retString;
if (isValidIndex(file_index) && OpenFilestreams()[file_index]->good()) {
std::getline(*OpenFilestreams()[file_index], retString);
}
return retString;

其中 file 是 OpenFilestreams() "is"一个 vector (包含所有打开文件的静态 vector ),而 file_index 是 vector 中的一个索引。那么如何确保它使用正确的编码读取呢?


至于用途:

实际上尝试使用以下方法将其转换为 wstring:

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.from_bytes(input.c_str());

给出 std::range_error 异常。 (我需要 wstring 用于其他 Windows api 函数)。

最佳答案

std::getline 无法获取文件的编码。您可以使用 std::locale 来更改使用的编码。

一些 Unicode 文件包含 BOM(说明使用的编码),这不是必需的。

通常情况下,如果 BOM 存在,文本应用程序会使用该编码,如果不存在,则尝试进行启发式识别所使用的编码并使用该编码读取文本,规范化文本(例如:UTF8),假设在其余部分app 文本为 UTF8,并以读取的相同编码保存。

关于 Unicode 的一些信息 Joel Spolsky Unicode Article
关于 Reading Unicode Encodings in C++ 的其他文章

关于c++ - unicode "aware"std::getline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24790637/

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