我必须打开带有西里尔符号的文件。我已将文件编码到utf8中。下面是一个例子:
你的家人不能为你买一套戏服吗? (C)ru:Невашасемьяпозволитьсебекостюмдлявас
如何打开文件:
ifstream readFile(fileData.c_str());
while (!readFile.eof())
{
std::getline(readFile, buffer);
...
}第一个问题是,在文本'en‘之前有一些符号(我在调试器中看到了这个):
“易懂”,“至少”
另一个问题是西里尔的符号:
“ru: 0.5°、25°、25°、25°、Œˆ、ru、ru、R
怎么了?
发布于 2010-02-16 22:46:35
在文本'en‘之前有一些符号
这是一个伪BOM,是将U+FEFF字节顺序标记字符编码为UTF-8的结果.
由于UTF-8是一种没有字节顺序的编码,因此不应该使用faux-BOM,但不幸的是,相当多的现有软件(特别是在MS世界中)仍然使用。将消息文件加载到文本编辑器中,并将其再次保存为UTF-8,如果特别列出的话,则使用“UTF-8无BOM”编码。
ru:
这就是当您有一个UTF-8字节字符串(代表наименьший),并打印它就像一个代码页1252 (Windows西欧)字节字符串一样。这不是输入问题;您已经读取了字符串OK,并有一个UTF-8字节字符串。但是,在您没有引用的代码中,它将输出为cp1252。
如果您只是将其打印到控制台,这是意料之中的,因为控制台总是使用系统默认代码页(在西部Windows安装上使用1252),而不是使用UTF-8。如果需要将Unicode发送到控制台,则必须将字节转换为本机-Unicodewchar,并从那里写入它们。我不知道你的琴弦的最终目的地是什么.如果您只打算将它们写入另一个文件或其他文件,您只需将它们保持为字节,而不关心它们所处的编码方式。
发布于 2010-02-16 23:51:09
我想你的操作系统是窗户。有几种方法很简单:
注意:对于控制台打印,您必须使用WinApi函数将UTF-8转换为cp866 (我默认的cyrilic编码cp1251),因为windows控制台只支持dos编码。
注意:对于文件打印,您需要知道使用什么编码使用您的文件。
发布于 2010-02-16 22:24:26
使用libiconv在读取后将文本转换为可用的编码。
https://stackoverflow.com/questions/2276725
复制相似问题