Определите, является ли текстовый файл без спецификации UTF8 или ASCII - PullRequest
1 голос
/ 26 января 2011

Короче говоря:
+ Я использую ffmpeg для проверки имени исполнителя файла MP3.
+ Если в названии артиста есть азиатские символы, вывод будет UTF8.
+ Если в нем только символы ASCII, выводится ASCII.

Выход не использует индикацию спецификации в начале.

Проблема в том, что если у артиста есть, например, «ä» в названии, то это ASCII, а не US-ASCII, поэтому «ä» недопустим в UTF8 и пропускается.

Как я могу определить, является ли выходной текстовый файл из ffmpeg UTF8 или нет? Приложение не имеет переключателей, и я просто думаю, что глупо не всегда использовать UTF8. : /

Что-то вроде этого было бы идеально:

http://linux.die.net/man/1/isutf8

Если кто-нибудь знает версию Windows?

Большое спасибо перед рукой, ребята!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Вы говорите, "ä" недействительно UTF-8 ... Это не правильно ...
Кажется, у вас нет четкого понимания того, что такое UTF-8,UTF-8 - это система как для кодирования кодовые точки Unicode .Вопрос достоверности не в самом символе, а в том, как он был закодирован ...
Существует множество систем, которые могут кодировать Unicode Codepoints ;UTF-8 - это одно, а UTF16 - это другое ... "ä" вполне допустимо в системе UTF-8. Фактически все символы действительны, если этот символ имеет кодовую точку Unicode.

Однако ASCII имеет только 128 допустимых значений, которые идентичны первым 128 символам в системе кодовых точек Unicode.Unicode сам по себе не более, чем большой справочный стол.Что делает эта система кодирования;например.UTF-8.

Поскольку 128 символов ASCII идентичны первым 128 символам Unicode, а UTF-8 может представлять эти 128 значений одним байтом, как это делает ASCII, это означает, что данные в файле ASCII идентичен файлу с той же датой, но который вы называете файлом UTF-8.Проще говоря: ASCII - это подмножество UTF-8 ... они неразличимы для данных в диапазоне ASCII (т. Е. 128 символов).

Вы можете проверить файл на соответствие 7-битному ASCII ..

# If nothing is output to stdout, the file is 7-bit ASCII compliant 
# Output lines containing ERROR chars -- to stdout

  perl -l -ne '/^[\x00-\x7F]*$/ or print' "$1"

Вот аналогичная проверка на соответствие UTF-8 ..

perl -l -ne '/
   ^( ([\x00-\x7F])              # 1-byte pattern
     |([\xC2-\xDF][\x80-\xBF])   # 2-byte pattern
     |((([\xE0][\xA0-\xBF])|([\xED][\x80-\x9F])|([\xE1-\xEC\xEE-\xEF][\x80-\xBF]))([\x80-\xBF])) # 3-byte pattern
     |((([\xF0][\x90-\xBF])|([\xF1-\xF3][\x80-\xBF])|([\xF4][\x80-\x8F]))([\x80-\xBF]{2}))       # 4-byte pattern
    )*$ /x or print' "$1"
0 голосов
/ 26 января 2011

Эта программа / источник может помочь вам:

Определить кодировкутекст без BOM (Byte Order Mask) и выберите лучшую кодировку ...

...