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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
8 565
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

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

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

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

Другие вопросы по теме