Как исправить кодировку символов в файле?

У меня есть текстовый файл в кодировке ANSI, который не должен быть закодирован как ANSI, поскольку там были символы с диакритическими знаками, которые ANSI не поддерживает. Я бы предпочел работать с UTF-8.

Могут ли данные быть декодированы правильно или они теряются при перекодировании?

Какие инструменты я мог использовать?

Вот пример того, что у меня есть:

ç é

Я могу сказать из контекста (cafe © должно быть кафе), что это должны быть эти два персонажа:

ç é

person Liam    schedule 25.09.2008    source источник
comment
Знаете ли вы исходную кодировку файла (при условии, что он в какой-то момент был преобразован из одной кодировки в другую)? В этом случае вы сможете преобразовать полученные символы обратно в исходные символы с помощью таких таблиц, как этот. Если вы не знаете исходную кодировку, вы, вероятно, могли бы решить ее, используя вероятностный подход, основанный на частоте использования разных слов в языке, с которым вы работаете. Но вы, возможно, не захотите выполнить ту работу, которая потребовала бы.   -  person gregory    schedule 25.09.2008
comment
К сожалению, исходной кодировки я не знаю. Это обычная проблема, когда клиенты отправляют вам файлы, созданные в различных системах. Они могут не знать, что такое кодировка символов. Обратите внимание, что растущее распространение настольных компьютеров Linux, использующих UTF-8 по умолчанию, может прозрачно уменьшить эту проблему.   -  person Liam    schedule 25.09.2008
comment
Я абсолютно согласен. UTF-8 определенно является наиболее разумной кодировкой для использования в большинстве ситуаций, но, к сожалению, вряд ли клиенты поймут это или отреагируют на это.   -  person gregory    schedule 25.09.2008


Ответы (12)


РЕДАКТИРОВАТЬ: простую возможность устранить, прежде чем переходить к более сложным решениям: пробовали ли вы установить набор символов на utf8 в текстовом редакторе, в котором вы читаете файл? Это может быть случай, когда кто-то отправляет вам файл utf8, который вы читаете в редакторе, настроенном на cp1252.

Просто возьмем два примера, это случай, когда utf8 читается через призму однобайтовой кодировки, вероятно, один из iso-8859-1, iso-8859-15 или cp1252. Если вы можете опубликовать примеры других проблемных персонажей, это должно быть возможно сузить круг вопросов.

Поскольку визуальный осмотр символов может вводить в заблуждение, вам также необходимо посмотреть на лежащие в основе байты: §, который вы видите на экране, может быть либо 0xa7, либо 0xc2a7, и это определит тип преобразования набора символов, который вам нужно сделать.

Можете ли вы предположить, что все ваши данные были искажены точно так же - что они поступили из одного источника и прошли одну и ту же последовательность преобразований, так что, например, в вашем тексте нет ни одного é, он всегда ç? Если это так, проблема может быть решена с помощью последовательности преобразований набора символов. Если вы можете быть более конкретными в отношении среды, в которой вы находитесь, и базы данных, которую вы используете, кто-нибудь из присутствующих, вероятно, скажет вам, как выполнить соответствующее преобразование.

В противном случае, если проблемные символы встречаются только в некоторых местах ваших данных, вам придется брать их экземпляр за экземпляром, основываясь на предположениях типа «ни один автор не намеревался вставлять § в свой текст, поэтому всякий раз, когда вы видите его заменить на ç ". Последний вариант более рискован, во-первых, потому, что эти предположения о намерениях авторов могут быть ошибочными, во-вторых, потому что вам придется самостоятельно определять каждого проблемного персонажа, что может быть невозможно, если текста слишком много для визуального просмотра или если он написан. на чужом для вас языке или системе письма.

person Community    schedule 25.09.2008
comment
Множество опций, в зависимости от того, где вы находитесь: hd -c filename, открытие его в vi и поиск странных escape-символов, bin2hex в php, hex (fieldname) в mysql. - person ; 16.10.2008
comment
Спасибо, кажется, это лучшее решение. Понимание лежащих в основе байтов и их разумная замена кажется самым разумным вариантом, поскольку я разрабатываю сценарий для автоматизации изменений. - person Liam; 24.10.2008

Выполните следующие действия с Notepad ++

1- Скопируйте исходный текст

2- В Notepad ++ откройте новый файл, измените кодировку -> выберите кодировку, которая, по вашему мнению, следует за исходным текстом. Попробуйте также кодировку "ANSI", так как иногда файлы Unicode читаются некоторыми программами как ANSI.

3- Вставить

4- Затем, чтобы преобразовать в Юникод, перейдя еще раз в то же меню: Кодирование -> «Кодировать в UTF-8» (не «Преобразовать в UTF-8»), и, надеюсь, он станет читаемым.

Вышеуказанные шаги применимы для большинства языков. Вам просто нужно угадать исходную кодировку перед вставкой в ​​блокнот ++, а затем преобразовать через то же меню в альтернативную кодировку на основе Unicode, чтобы увидеть, станет ли что-то читаемым.

Большинство языков существует в двух формах кодирования: 1. Старая устаревшая форма ANSI (ASCII), всего 8 бит, первоначально использовалась большинством компьютеров. 8 бит допускают только 256 возможностей, 128 из которых содержат обычные латинские и управляющие символы, последние 128 бит читаются по-разному в зависимости от языковых настроек ПК 2 - Новый стандарт Unicode (до 32 бит) дает уникальный код для каждого символа на всех известных в настоящее время языках и многое другое в будущем. если файл имеет формат Unicode, его следует понимать на любом ПК с установленным шрифтом языка. Обратите внимание, что даже UTF-8 становится 32-битным и такой же широкий, как UTF-16 и UTF-32, только он пытается сохранить 8 бит с латинскими символами, чтобы сэкономить место на диске.

person Gabriel    schedule 18.12.2013
comment
спасибо broda, ваш ответ спас меня от двухдневной проблемы с кодировкой файла .sql. Оно работает. К черту Sublime Text на Mac! - person WhySoSerious; 02.02.2016
comment
ты гений - person Nir; 11.12.2017
comment
Я использовал специальную вставку - вставлял двоичные данные - person fingerman; 20.03.2018
comment
В блокноте ++, если вы просто откроете исходный файл, перейдите в меню кодирования и посмотрите, что выбрано. Он также имеет преобразование в, чтобы вы могли видеть, соответствует ли он наборам символов. Я знаю, что это старый вопрос. - person DoomVroom; 13.05.2021

Когда вы видите последовательности символов, такие как § и Ã ©, это обычно означает, что файл UTF-8 был открыт программой, которая считывает его как ANSI (или аналогичный). Такие символы Unicode:

U + 00C2 Заглавная латинская буква A с циркумфлексом
U + 00C3 Заглавная латинская буква A с тильдой
U + 0082 Разрыв разрешен здесь
U + 0083 Здесь разрыв отсутствует

имеют тенденцию появляться в тексте ANSI из-за стратегии с переменным байтом, которую использует UTF-8. Эта стратегия очень хорошо объяснена здесь.

Преимущество для вас заключается в том, что появление этих нечетных символов позволяет относительно легко найти и, таким образом, заменить экземпляры неправильного преобразования.

Я считаю, что, поскольку ANSI всегда использует 1 байт на символ, вы можете справиться с этой ситуацией с помощью простой операции поиска и замены. Или, что более удобно, с программой, которая включает отображение таблицы между нарушающими последовательностями и желаемыми символами, например:

â € œ -> «# должно быть открывающей двойной фигурной кавычкой
â €? -> ”# должно быть закрывающей двойной фигурной кавычкой

Любой заданный текст, если он на английском языке, будет иметь относительно небольшое количество различных типов замен.

Надеюсь, это поможет.

person gregory    schedule 25.09.2008

С помощью vim из командной строки:

vim -c "set encoding=utf8" -c "set fileencoding=utf8" -c "wq" filename
person Zsolt Botykai    schedule 25.09.2008

Используйте iconv - см. Лучший способ конвертировать текстовые файлы между наборами символов?

person Troels Arvin    schedule 25.09.2008
comment
Будет ли простое преобразование предполагать, что данные верны, и сохранять ли неправильные данные? - person Liam; 25.09.2008
comment
Да, это будет. Я думаю, что люди неправильно понимают вопрос. Проблема в том, что данные уже повреждены, поэтому вам нужно решение для исправления. - person gregory; 25.09.2008

В превосходном текстовом редакторе файл -> повторно открыть с кодировкой -> выберите правильную кодировку.

Как правило, кодировка определяется автоматически, но если нет, вы можете использовать описанный выше метод.

person user3342981    schedule 29.06.2016

Если вы видите вопросительные знаки в файле или если акценты уже потеряны, возврат к utf8 не поможет вашему делу. например если кафе превратилось в кафе - сама по себе смена кодировки не поможет (и понадобятся исходные данные).

Не могли бы вы вставить сюда какой-нибудь текст, который точно поможет нам ответить.

person Community    schedule 25.09.2008

А еще есть несколько более старая программа recode.

person Community    schedule 25.09.2008

Существуют программы, которые пытаются определить кодировку файла, например chardet. Затем вы можете преобразовать его в другую кодировку с помощью iconv. Но для этого необходимо, чтобы исходный текст оставался нетронутым и никакая информация не терялась (например, при удалении акцентов или целых букв с диакритическими знаками).

person Community    schedule 25.09.2008

Я нашел простой способ автоматически определять кодировки файлов - преобразовать файл в текстовый файл (на Mac переименовать расширение файла в .txt) и перетащить его в окно Mozilla Firefox (или Файл -> Открыть). Firefox определит кодировку - вы можете увидеть, что он придумал, в меню «Просмотр» -> «Кодировка символов».

Я изменил кодировку своего файла с помощью TextMate, как только узнал правильную кодировку. Файл -> Открыть повторно с использованием кодировки и выбрать кодировку. Затем File -> Save As и измените кодировку на UTF-8, а окончания строк на LF (или как хотите)

person Mark Robinson    schedule 23.03.2010

В OS X Synalyze It! позволяет отображать части вашего файла в различных кодировках (все они поддерживаются библиотекой ICU ). Как только вы узнаете, что такое исходная кодировка, вы можете скопировать весь файл (байты) через буфер обмена и вставить в новый документ, где выбрана целевая кодировка (UTF-8 или что угодно).

При работе с UTF-8 или другими представлениями Unicode очень полезен UnicodeChecker.

person pi3    schedule 26.06.2013

Я нашел этот вопрос при поиске решения проблемы с кодовой страницей, которая у меня была с китайскими иероглифами, но, в конце концов, моя проблема заключалась в том, что Windows не отображала их правильно в пользовательском интерфейсе.

Если у кого-то еще есть такая же проблема, вы можете исправить ее, просто изменив локальный адрес в Windows на Китай, а затем снова.

Я нашел решение здесь:

http://answers.microsoft.com/en-us/windows/forum/windows_7-desktop/how-can-i-get-chinesejapanese-characters-to/fdb1f1da-b868-40d1-a4a4-7acadff4aafa?page=2&auth=1

Также поддержал ответ Габриэля, поскольку просмотр данных в блокноте ++ был тем, что подсказало мне об окнах.

person Malcolm Lock    schedule 28.01.2016