繁体   English   中英

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

[英]I get “Invalid utf 8 error” when checking string, but it seems correct when i use std::cout

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

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

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

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

但是当我从文件中读取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位的位数表示字节的总数,后跟一个零位(明显),其余位变为代码点的高位
  • 因为已经表示了1个字节,所以设置了高位和未设置下一个位的字节是连续字节:低6位是代码点表示的一部分

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

  1. 在期望起始字节的位置遇到一个连续字节
  2. 有一个开始字节表示随后有更多连续字节

我没有周围的代码可以指出哪里出了问题,但是编写这样的代码应该很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM