Как определить набор символов строки?

У меня есть несколько файлов на разных языках. Я думал, что все они были в кодировке UTF-8, но теперь я не уверен. Некоторые персонажи выглядят нормально, некоторые нет. Есть ли способ, которым я могу разбить строки и попытаться идентифицировать наборы символов? Возможно, разделить на пробел, а затем идентифицировать каждое слово? Наконец, есть ли простой способ перевести символы из одного набора в UTF-8?


person Community    schedule 25.11.2008    source источник


Ответы (3)


Если вы точно не знаете набор символов, то, в принципе, можете только догадываться. utf8::valid может помочь вам в этом, но вы не можете знать наверняка. Если вы знаете, что если это не юникод, то это должен быть определенный набор символов (например, Latin-1), вам повезло. Если вы понятия не имеете, вы облажались. В любом случае вы всегда должны предполагать, что весь файл имеет один и тот же набор символов, если не указано иное. Вы потеряете рассудок, если не сделаете этого.

Что касается вашего вопроса о том, как преобразовать наборы символов: Encode нужно сделать это для тебя

person Leon Timmermans    schedule 25.11.2008

Определить, является ли файл, вероятно, UTF-8 или нет, должно быть довольно легко. Определить кодировку, если это не UTF-8, в общем случае было бы очень сложно.

Если файл закодирован с помощью UTF-8, старшие биты каждого байта должны соответствовать шаблону. Если символ состоит из одного байта, его старший бит будет очищен (ноль). В противном случае n байтовый символ (где n равно 24) будет иметь старшие n биты первого байта, установленные в единицу, за которыми следует один нулевой бит. В следующих n - 1 байтах должен быть установлен старший бит, а второй по старшинству бит очищен.

Если все байты в вашем файле соответствуют этим правилам, вероятно, он закодирован в UTF-8. Я говорю «вероятно», потому что любой может изобрести новую кодировку, которая намеренно или случайно следует тем же правилам, но интерпретирует коды по-разному.

Обратите внимание, что файл, закодированный с помощью US-ASCII, будет следовать этим правилам, но старший бит каждого байта равен нулю. Можно обращаться с таким файлом как с UTF-8, так как они совместимы в этом диапазоне. В противном случае это какая-то другая кодировка, и нет встроенного теста, чтобы отличить кодировку. Вам придется использовать некоторые контекстуальные знания, чтобы угадать.

person erickson    schedule 25.11.2008

Взгляните на iconv

http://www.gnu.org/software/libiconv/

Text::Iconv

person rebra    schedule 25.11.2008