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

C++ 我得到;无效的utf 8错误“;当检查字符串时,但当我使用std::cout时,它似乎是正确的,c++,utf-8,C++,Utf 8,我正在写一些代码,必须读取UTF8编码的文本文件,并将它们发送到OpenGL 还使用我从本网站下载的库: 当我写下这些时,我可以在OpenGL窗口上显示正确的图像: std::string somestring=“abcçdefgğh” //将字符串转换为utf32编码。。 //我还在程序启动时设置本地 但当我从文件中读取utf8编码字符串时: void something(){ std::ifstream ifs("words.xml"); std::string readd; if(ifs.

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

还使用我从本网站下载的库:

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

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

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

void something(){
std::ifstream ifs("words.xml");
std::string readd;
if(ifs.good()){
while(!ifs.eof()){
std::getline(ifs, readd);
// do something..
}
}
}
  • 库警告我字符串没有有效的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无效:

  • 在需要开始字节的位置遇到延续字节
  • 有一个起始字节,表示后面有更多的继续字节

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

    您的编译器支持utf8格式的源文件吗?您还需要通过在字符串前面加上
    u8
    ,确保字符串文字为utf8。感谢您的回复:)我正在使用MinGW,源文件是utf8编码的。因此,MinGW似乎支持它:)即使我不使用u8前缀,它也不会导致问题,因为源代码是utf 8编码的(或者可能是因为其他原因,它不会出错)。感谢您的帮助:)我发现我尝试了两次将字符串转换为utf32。当我尝试将utf32(假设为utf8)转换为utf32时,它崩溃了。当我尝试使用std::cout检查它时,它显示了正确的字符。我想这意味着MinGW命令窗口支持UTF32(这是我没想到的)。再次感谢。