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





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