我在检查字符串时得到"Invalid utf 8 error",但当我使用 std::cout 时似乎是正确的



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

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

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

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

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

  • 库警告我字符串没有有效的utf编码
  • 我无法将"从文件读取"字符串发送到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检查它时,它看起来如何?

  • 我该如何解决这个问题?

提前感谢:)

编写输出的shell可能对它不理解的字符相当健壮。似乎并不是所有使用的软件都是这样。然而,它应该相对直接地验证字节序列是否是有效的UTF-8序列:UTF-8编码相对直接:

  • 每个代码点都以一个字节开始,该字节表示要读取的字节数和第一对字节:
    • 如果高位为0,则代码点由7个低位表示的一个字节组成
    • 否则,前导1位的数量表示后面跟着0位的字节总数,剩余的位成为代码点的高位
  • 由于已经表示了1个字节,高位设置的字节和下一个未设置的字节是连续字节:低位6位是代码点表示的一部分

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

  1. 在需要起始字节的位置遇到延续字节
  2. 有一个起始字节表示后面有更多的延续字节

我没有可以指示哪里出了问题的代码,但编写这样的代码应该相当简单。

最新更新