C++ 比较UTF8编码字符

C++ 比较UTF8编码字符,c++,unix,utf-8,C++,Unix,Utf 8,有一个csv文件,它有许多不同的语言编码在utf-8中。我必须解析文件并验证是否存在无效字符。 我已经写了一个示例程序如下所示 int main(void) { string invalidUTF8Chars = ""; // Invalid UTF-8 Chars array. invalidUTF8Chars+= "\u00A0"; invalidUTF8Chars+= "\u005E"; invalidUTF8Chars+= "\u00FE"; in

有一个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;
}
如何将从文件读取的数据与无效字符进行比较?

strchr()
未能找到字符时,它将返回空指针。您需要做的是检查返回是否为空指针:

if(strchr(invalidUTF8Chars.c_str(), ch) == nullptr){
    printf("Invalid character\n");
}
以下是为方便起见提供的参考。

strhr()
无法找到字符时,它将返回空指针。您需要做的是检查返回是否为空指针:

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

以下是为方便您而提供的参考。

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");

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");

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