我打开文件使用西里尔符号。 我已经编码的文件为UTF8。 下面是例子:
EN:无法您的家庭买得起的服装适合你
RU:不要你的家庭买得起的服装适合你
如何打开文件:
ifstream readFile(fileData.c_str());
while (!readFile.eof())
{
std::getline(readFile, buffer);
...
}
第一个麻烦,有文字“恩”之前的一些符号(我看到这个调试器):
“我»¿和最“
而另一个问题是西里尔符号:
" ru: наименьший"
怎么了?
有前文“恩”了一些符号
这是一个人造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和他们从那里写。 我不知道你的字符串最终目标是什么,虽然...如果你只是将它们写入到另一个文件或东西你可以只让他们为字节,不关心他们在什么编码。
我假设你的操作系统是Windows。 存在几种方法很简单:
- 使用wchar_t的,wstring的,wifstream等。
- 使用ICU库
- 使用其他超级puper库(他们真的很多)
注:控制台打印您必须使用WINAPI功能为UTF-8转换为CP866(我的默认cyrilic Windows编码CP1251),因为Windows控制台只支持DOS编码。
注:打印文件,你需要知道什么编码使用您的文件