【问题标题】:Comparing UTF8 encoded chars比较 UTF8 编码的字符
【发布时间】:2017-02-15 10:22:15
【问题描述】:

有一个 csv 文件,其中有许多以 utf-8 编码的不同语言。我必须解析文件并验证无效字符。 我已经编写了一个示例程序,如下所示……

int main(void)
{
    string invalidUTF8Chars = ""; // Invalid UTF-8 Chars array.
    invalidUTF8Chars+= "\u00A0";
    invalidUTF8Chars+= "\u005E";
    invalidUTF8Chars+= "\u00FE";
    invalidUTF8Chars+= "\u00BA";
    invalidUTF8Chars+= "\u00AF";

    FILE* fp;
    char ch;
    fp = fopen("unicodeUTF8TextFile.txt","r");

    if(fp != NULL)
    {
        while(( ch = fgetc(fp) ) != EOF ) // Reading byte by byte form input file.
        {
            //if (strchr(invalidUTF8Chars.c_str(), ch)) // How do I validate here?
            {
                printf("Invalid character\n");
            }
        }
    }
        return 0;
}

如何比较从文件中读取的数据和无效字符?

【问题讨论】:

  • char ch; 是一个巨大的错误;请在继续之前仔细研究 API。
  • string invalidUTF8Chars = ""; 不是数组。它只是一个包含所有无效“字符”的字符串。
  • 如果你真的想要 UTF-8,你的文字应该是 u8"\u00A0" 等形式。您当前的代码不使用 UTF-8,而是使用系统的窄编码(可能相同也可能不同)。
  • @KerrekSB 说应该是int,以便为 EOF 留出空间。
  • @LightnessRacesinOrbit:如何比较 utf8 字符?

标签: c++ unix utf-8


【解决方案1】:

strchr() 找不到字符时,它会返回一个 NULL 指针。您需要做的是检查返回是否为 NULL 指针:

if(strchr(invalidUTF8Chars.c_str(), ch) == nullptr){
    printf("Invalid character\n");
}

为了您的方便,这里是strchr() 参考。

【讨论】:

    【解决方案2】:

    UTF-8 的无效字符可能意味着 UTF-8 编码无效并且不对应任何字符,或者 UTF-8 解码会导致您不想要的字符。

    您对第二种变体感兴趣,其中每个字符在 UTF-8 中编码为一个或多个字节,具体而言,“\u005E”在 UTF-8 中是一个字节,其他是 2 个字节。

    因此,您不能在示例中拒绝单个字节,而是需要解码为 Unicode 字符或将所有内容读取为 UTF-8,然后使用以下内容查找问题:

      if (strstr(readFile, u8"\u00A0") != nullptr || strstr(readFile, u8"\u005E") != nullptr ... ) printf("Found bad character\n");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2011-04-07
      • 2011-10-24
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      相关资源
      最近更新 更多