我必须用西里尔符号打开文件。我把文件编码成utf8。这是一个例子:
:你的家人不能负担得起 为你服装
茹:Невашасемья позволитьсебекостюмдлявас
如何打开文件:
ifstream readFile(fileData.c_str());
while (!readFile.eof())
{
std::getline(readFile, buffer);
...
}
第一个问题,在文本'en'之前有一些符号(我在调试器中看到了这个):
“en:least”
另一个麻烦是西里尔符号:
“ru:наимÐμньÑий”
怎么了?
答案 0 :(得分:3)
在文字'en'之前有一些符号
这是一个虚假BOM,是将U + FEFF BYTE ORDER MARK字符编码为UTF-8的结果。
由于UTF-8是一种没有字节顺序的编码,因此不应该使用虚假BOM,但不幸的是,相当多的现有软件(特别是在MS世界中)仍然存在。将消息文件加载到文本编辑器中,然后使用“UTF-8无BOM”编码将其再次保存为UTF-8,如果特别列出的话。
ru:наимÐμньÑий
当你有一个UTF-8字节字符串(代表наименьший
)并且你打印它就好像它是一个Code Page 1252(Windows Western European)字节字符串时,这就是你得到的。这不是输入问题;你已经在字符串中读取了OK并且有一个UTF-8字节字符串。但是,在你没有引用的代码中,它会输出为cp1252。
如果您只是将其打印到控制台,这是可以预期的,因为控制台始终使用系统默认代码页(西式Windows安装时为1252),而不是UTF-8。如果需要将Unicode发送到控制台,则必须将字节转换为native-Unicode wchar
并从那里写入。我不知道你的字符串的最终目的地是什么...如果你只是要将它们写入另一个文件或其他东西,你可以将它们保存为字节而不关心它们所处的编码。 / p>
答案 1 :(得分:1)
注意:对于控制台打印,您必须使用WinApi函数将UTF-8转换为cp866(我的默认cyrilic windows编码cp1251),因为Windows控制台仅支持dos编码。
注意:对于文件打印,您需要知道使用文件的编码
答案 2 :(得分:0)
使用libiconv
在阅读后将文本转换为可用的编码。
答案 3 :(得分:0)
使用icu转换文字。