2017-02-15 138 views
0

有一个csv文件,它具有用UTF-8编码的许多不同的语言。我必须解析文件并验证无效字符。 我写了下面所显示的一个范例程序......比较UTF8编码的字符

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; 
} 

我如何比较来自反对无效字符的文件中读取数据?

+1

'焦炭CH; '是一个巨大的错误;在继续之前请仔细研究 API。 –

+0

'string invalidUTF8Chars =“”;'不是数组。它只是一个包含所有无效“字符”的字符串。 – user1810087

+0

如果你真的想要UTF-8,你的文字应该是'u8“\ u00A0”'等。您当前的代码不使用UTF-8,而是系统的窄编码(可能相同也可能不相同)。 –

回答

0

strchr()未能找到一个字符时,它返回一个空指针。什么,你需要做的是检查,如果换来的是一个空指针或不:

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

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

0

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