【问题标题】:I get "Invalid utf 8 error" when checking string, but it seems correct when i use std::cout检查字符串时出现“无效的 utf 8 错误”,但当我使用 std::cout 时它似乎正确
【发布时间】:2013-12-19 19:19:44
【问题描述】:

我正在编写一些必须读取 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 检查它时,它看起来如何?

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

提前致谢:)

【问题讨论】:

  • 您的编译器是否支持 utf8 格式的源文件?您还需要确保您的字符串文字是 utf8,方法是在其前面加上 u8
  • 感谢您的回复:)我使用的是MinGW,源文件是utf8编码的。所以似乎MinGW支持它:)即使我不使用u8前缀它也不会导致问题,因为源是utf 8编码的(或者可能是因为其他原因,它不会出错)。

标签: c++ utf-8


【解决方案1】:

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

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

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

  1. 在需要开始字节的地方遇到连续字节
  2. 有一个起始字节表示后面有更多的连续字节

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

【讨论】:

  • 感谢您的帮助:) 我发现我试图将字符串转换为 utf32 两次。当我尝试将 utf32(假设为 utf8)转换为 utf32 时,它崩溃了。当我尝试使用 std::cout 检查它时,它显示了正确的字符。我认为这意味着 MinGW 命令窗口支持 UTF32(我没想到)。再次感谢。
猜你喜欢
  • 2020-04-19
  • 2017-04-28
  • 2014-12-02
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多