我正在编写一些代码,这些代码必须读取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无效:
- 在需要起始字节的位置遇到延续字节
- 有一个起始字节表示后面有更多的延续字节
我没有可以指示哪里出了问题的代码,但编写这样的代码应该相当简单。