我正在测试如何编写一个实际上可以读取(和更改)文本文件的C ++应用程序,同时尊重用于文本的编码。我希望(对于其他API' s)将所有读取文本显式转换为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函数)。
答案 0 :(得分:1)
std :: getline无法获取文件的编码。您可以使用std :: locale更改使用的编码。
某些Unicode文件包含BOM(表明所使用的编码),因此不需要。
通常情况下,如果BOM存在,文本应用程序使用该编码,如果不尝试使用启发式来识别所使用的编码并使用该编码读取文本,则对文本进行规范化(例如:UTF8),在其余部分中假设app文本是UTF8,并以与读取的相同编码保存。
有关Unicode Joel Spolsky Unicode Article的一些信息 关于Reading Unicode Encodings in C++
的其他文章