unicode“感知”std::getline

2024-02-12

好吧,我正在测试如何编写一个 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;

文件在哪里OpenFilestreams()“是”一个向量(包含所有打开的文件的静态向量),并且file_index向量中的索引。那么如何确保它使用正确的编码读取呢?


至于用途:

实际上尝试使用以下方法将其转换为 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),假设在应用程序的其余部分中使用文本采用 UTF8 格式,并以读取的相同编码保存。

关于 Unicode 的一些信息乔尔·斯波尔斯基 Unicode 文章 http://www.joelonsoftware.com/articles/Unicode.html
其他文章关于在 C++ 中读取 Unicode 编码 http://www.codeproject.com/Articles/38242/Reading-UTF-8-with-C-streams

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unicode“感知”std::getline 的相关文章

随机推荐