用西里尔文阅读文件

时间:2010-02-16 22:08:17

标签: c++ encoding

我必须用西里尔符号打开文件。我把文件编码成utf8。这是一个例子:

  

:你的家人不能负担得起   为你服装
  茹:Невашасемья   позволитьсебекостюмдлявас

如何打开文件:

ifstream readFile(fileData.c_str());
while (!readFile.eof())
{
  std::getline(readFile, buffer);
  ...
}

第一个问题,在文本'en'之前有一些符号(我在调试器中看到了这个):

  

“en:least”

另一个麻烦是西里尔符号:

  

“ru:наимÐμньÑий”

怎么了?

4 个答案:

答案 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)

我认为你的操作系统是Windows。存在几种简单的方法:

  1. 使用wchar_t,wstring,wifstream等
  2. 使用icu库
  3. 使用其他超级puper库(真的很多)
  4. 注意:对于控制台打印,您必须使用WinApi函数将UTF-8转换为cp866(我的默认cyrilic windows编码cp1251),因为Windows控制台仅支持dos编码。

    注意:对于文件打印,您需要知道使用文件的编码

答案 2 :(得分:0)

使用libiconv在阅读后将文本转换为可用的编码。

答案 3 :(得分:0)

使用icu转换文字。