C++ 比较UTF8编码字符
有一个csv文件,它有许多不同的语言编码在utf-8中。我必须解析文件并验证是否存在无效字符。 我已经写了一个示例程序如下所示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
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字符?