Как определить набор символов строки? - PullRequest
7 голосов
/ 26 ноября 2008

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

Ответы [ 3 ]

6 голосов
/ 26 ноября 2008

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

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

6 голосов
/ 26 ноября 2008

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

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

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

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

2 голосов
/ 26 ноября 2008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...