unicode"意识到"的std ::函数getline

时间:2014-07-16 20:59:20

标签: c++ unicode encoding

我正在测试如何编写一个实际上可以读取(和更改)文本文件的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函数)。

1 个答案:

答案 0 :(得分:1)

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

某些Unicode文件包含BOM(表明所使用的编码),因此不需要。

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

有关Unicode Joel Spolsky Unicode Article的一些信息 关于Reading Unicode Encodings in C++

的其他文章