检查字符串时我收到“无效的utf 8错误”,但是当我使用std :: cout时它似乎是正确的

时间:2013-12-19 19:19:44

标签: c++ utf-8

我正在编写一些必须读取utf 8编码文本文件的代码,然后将它们发送到OpenGL。

还使用我从此网站下载的库:http://utfcpp.sourceforge.net/

当我写下这个时,我可以在OpenGL窗口上显示正确的图像:

std::string somestring = "abcçdefgğh";  //将字符串转换为utf32编码..  //我也在程序启动时设置了本地。

但是当我从文件中读取utf8编码的字符串时:

  • 图书馆警告我字符串没有有效的utf编码
  • 我无法将'read from file'字符串发送给OpenGL。它崩溃了。
  • 但我仍然可以使用std :: cout作为我从文件中读取的字符串(看起来正确)。

我使用此代码从文件中读取:

void something(){
std::ifstream ifs("words.xml");
std::string readd;
if(ifs.good()){
while(!ifs.eof()){
std::getline(ifs, readd);
// do something..
}
}
}

现在的问题是:

  • 如果从文件中读取的字符串不正确,当我用std :: cout检查它时,它看起来如何?

  • 如何解决此问题?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

您编写输出的shell可能对它不理解的字符非常健壮。似乎并非所有使用过的软件都是。但是,验证字节序列是否是有效的UTF-8序列应该相对简单:UTF-8编码相对简单:

  • 每个代码点以一个字节开头,表示要读取的字节数和前几个字节:
    • 如果高位为0,则代码点由7个低位
    • 表示的一个字节组成
    • 否则前导1位的数字表示总字节数,后跟一个零位(obiously),其余位成为代码点的高位
  • 因为已经表示了1个字节,所以高位设置和未设置的下一位的字节是连续字节:低6位是代码点表示的一部分

根据这些规则,有两件事可能出错并使UTF-8无效:

  1. 在期望起始字节的点处遇到连续字节
  2. 有一个开始字节,表示更多的连续字节,然后是
  3. 我没有可以指示出错的地方的代码,但编写此类代码应该相当直接。