2017-02-15 21 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

'полукокса ч; 'является массовой ошибкой; предварительно изучите API , прежде чем продолжить. –

+0

'string invalidUTF8Chars =" ";' не является массивом. это всего лишь строка, содержащая все ваши недопустимые «символы». – user1810087

+0

Ваши литералы должны иметь форму 'u8" \ u00A0 "и т. Д., Если вы действительно хотите UTF-8. Ваш текущий код не использует UTF-8, а скорее узкое кодирование системы (которое может быть или не быть одинаковым). –

ответ

0

Когда strchr() не находит символ, он возвращает NULL-указатель. Что вам нужно сделать, это проверить, если возврат был NULL-указатель или нет:

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