阅读使用西里尔文件(Reading file with cyrillic)

2019-11-03 02:43发布

我打开文件使用西里尔符号。 我已经编码的文件为UTF8。 下面是例子:

EN:无法您的家庭买得起的服装适合你
RU:不要你的家庭买得起的服装适合你

如何打开文件:

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

第一个麻烦,有文字“恩”之前的一些符号(我看到这个调试器):

“我»¿和最“

而另一个问题是西里尔符号:

" ru: наименьший"

怎么了?

Answer 1:

有前文“恩”了一些符号

这是一个人造BOM,编码U + FEFF字节顺序标记字符为UTF-8的结果。

由于UTF-8是没有字节顺序编码,该人造BOM不应该永远被使用,但遗憾的是不少现有的软件(特别是在MS世界)的仍然一样。 加载邮件文件转换为文本编辑器,退了出去重新保存为UTF-8,使用“UTF-8无BOM”编码如果一个人尤其是上市。

ru: наименьший

这就是你当你有一个UTF-8字节字符串(代表наименьший ),并在打印,就好像它是一个代码页1252(WINDOWS西欧)字节的字符串。 这不是一个输入的问题; 您已经阅读串OK中,有一个UTF-8字节串。 但随后,在代码中你有没有报价,它就会输出CP1252。

如果你只是将它打印到控制台,这是可以预料的,因为控制台始终使用系统默认代码页(1252西方的Windows安装),而不是UTF-8。 如果您需要发送Unicode到控制台,你必须转换成字节,以原生的Unicode wchar S和他们从那里写。 我不知道你的字符串最终目标是什么,虽然...如果你只是将它们写入到另一个文件或东西你可以只让他们为字节,不关心他们在什么编码。



Answer 2:

我假设你的操作系统是Windows。 存在几种方法很简单:

  1. 使用wchar_t的,wstring的,wifstream等。
  2. 使用ICU库
  3. 使用其他超级puper库(他们真的很多)

注:控制台打印您必须使用WINAPI功能为UTF-8转换为CP866(我的默认cyrilic Windows编码CP1251),因为Windows控制台只支持DOS编码。

注:打印文件,你需要知道什么编码使用您的文件



Answer 3:

使用libiconv将文本转换成可用的编码看完。



Answer 4:

使用ICU将文本转换。



文章来源: Reading file with cyrillic
标签: c++ encoding