У меня есть несколько файлов на разных языках. Я думал, что все они были в кодировке UTF-8, но теперь я не уверен. Некоторые персонажи выглядят нормально, некоторые нет. Есть ли способ, которым я могу разбить строки и попытаться идентифицировать наборы символов? Возможно, разделить на пробел, а затем идентифицировать каждое слово? Наконец, есть ли простой способ перевести символы из одного набора в UTF-8?
Как определить набор символов строки?
Ответы (3)
Если вы точно не знаете набор символов, то, в принципе, можете только догадываться. utf8::valid может помочь вам в этом, но вы не можете знать наверняка. Если вы знаете, что если это не юникод, то это должен быть определенный набор символов (например, Latin-1), вам повезло. Если вы понятия не имеете, вы облажались. В любом случае вы всегда должны предполагать, что весь файл имеет один и тот же набор символов, если не указано иное. Вы потеряете рассудок, если не сделаете этого.
Что касается вашего вопроса о том, как преобразовать наборы символов: Encode нужно сделать это для тебя
Определить, является ли файл, вероятно, UTF-8 или нет, должно быть довольно легко. Определить кодировку, если это не UTF-8, в общем случае было бы очень сложно.
Если файл закодирован с помощью UTF-8, старшие биты каждого байта должны соответствовать шаблону. Если символ состоит из одного байта, его старший бит будет очищен (ноль). В противном случае n
байтовый символ (где n равно 24) будет иметь старшие n
биты первого байта, установленные в единицу, за которыми следует один нулевой бит. В следующих n - 1
байтах должен быть установлен старший бит, а второй по старшинству бит очищен.
Если все байты в вашем файле соответствуют этим правилам, вероятно, он закодирован в UTF-8. Я говорю «вероятно», потому что любой может изобрести новую кодировку, которая намеренно или случайно следует тем же правилам, но интерпретирует коды по-разному.
Обратите внимание, что файл, закодированный с помощью US-ASCII, будет следовать этим правилам, но старший бит каждого байта равен нулю. Можно обращаться с таким файлом как с UTF-8, так как они совместимы в этом диапазоне. В противном случае это какая-то другая кодировка, и нет встроенного теста, чтобы отличить кодировку. Вам придется использовать некоторые контекстуальные знания, чтобы угадать.