- Средства Linux для перекодирования файлов
- Проблема новой строки
- Откуда пошли названия символов CR и LF
- Проблема кодировки
- Заключение
- Конвертирование файлов в кодировку UTF-8 в Linux
- Конвертирование файлов из UTF-8 в ASCII
- Конвертирование нескольких файлов в кодировку UTF-8
- Как определить кодировку файла или строки. Как конвертировать файлы в кодировку UTF-8 в Linux
- Программы для определения кодировки в Linux
- Команда file -i показывает неверную кодировку
- Программа enca для определения кодировки файла
- Как определить кодировку строки
- Изменение кодировки в Linux
- Использование команды iconv
- Конвертирование файлов из windows-1251 в UTF-8 кодировку
- Изменение кодировки программой enca
- Конвертация строки в правильную кодировку
Средства Linux для перекодирования файлов
Оригинал: Linux tools to convert file formats
Автор: Federico Kereki
Дата: 22 июля 2008
Перевод: Александр Тарасов aka oioki
Дата перевода: 14 августа 2008
Было бы намного проще, если бы мы жили в мире, в котором существует один лишь Linux, и если бы приложениям не требовались данные из других источников. Однако все еще существует необходимость в получении данных из систем Windows, MS DOS и Macintosh. Импортирование таких документов требует соответствующего перекодирования; иначе было бы невозможно обмениваться данными, или содержимое файлов интерпретировалось бы некорректно. Вообще самый простой способ передавать данные между системами — это с помощью обычных текстовых файлов или в таких форматах как CSV-файлы (значения, разделенные пробелами). Однако преобразование файлов из форматов Windows и Mac OS приводит к различиям в символах новой строки и кодировке символов . В этой статье рассказано, отчего возникают такие проблемы и как их устранить.
Проблема новой строки
Каждая операционная система использует определенный символ (или последовательность символов) для обозначения конца текстовой строки. Нельзя использовать обычные символы для указания новой строки, ведь они могут идти лишь в обычном тексте. Поэтому используется специальный непечатный символ — и у каждой ОС он свой:
- Linux и Mac OS X унаследовали Unix-стиль и используют LF (управляющий ASCII -символ line feed) в качестве символа конца строки.
- Старые Macintosh-системы использовали CR (carriage return, другой управляющий ASCII-символ).
- В Windows используется два символа — CR и затем LF.
Чтобы узнать, какой символ используется в текстовом файле для новой строки, запустите hexdump . С его помощью можно исследовать содержимое файла побайтово. Я подготовил два трехстроковых файла — один на Linux-системе, другой на Windows — и вывел их содержимое побайтово. Файл выводится порциями по 16 байт, отображаются собственно символы и их представления в восьмеричной системе счисления. Обратите внимание, что Linux-файл содержит управляющий символ \n, а Windows — \r и затем \n. На старых Macintosh-системах вы бы увидели одиночный символ \r.
Для преобразования файлов из Windows в Linux можно воспользоваться командой с говорящим названием dos2unix . Самый простой способ преобразовать файл test.windows в формат Linux — запустить
Однако можно воспользоваться и потоковым вариантом:
Все ключи команды можно узнать, посмотрев справку dos2unix -h или man dos2unix .
Для преобразования текстового файла со старой Macintosh-системы необходимо заменить символы CR на LF, это можно сделать с помощью программы tr (translate): который просто меняет каждый символ CR (восьмеричное 015) на LF (восьмеричное 012). tr также может произвести удаление символа CR для преобразования из Windows-системы, нужно воспользоваться ключом -d. Действие, аналогичное действию ранее упомянутой dos2unix, достигается следующим образом:
Проблема кодировки
Помимо обычных 26 символов в английском языке (да и во многих других) используются и специальные типографические символы. Смотрели ли вы фильм Æon Flux и посылали ли curriculum vitæ? В немецком тексте рассыпано множество гласных с умляутами и буквы наподобие ß. В испанском есть разнообразные ň и острые акценты, во французском языке — грависы и циркумфлексы («pie à la mode»). Если вам нужно набирать такие символы на обычной клавиатуре, обратитесь к этой статье .
Unicode не нужен для обычного английского текста: вполне хватит ASCII-символов, включающих обычные неакцентированные буквы от A до Z, цифры от 0 до 9 и знаки пунктуации. Если вы работаете только с латинским алфавитом, использующимся в странах Западной Европы, то можете сохранять текст в кодировке ISO 8859-1 (неформально ее называют Latin-1), в которой каждый символ занимает один байт, однако в ней невозможно представить символы других языков. Однако в других языках требуется более широкий набор символов и без Unicode не обойтись. Unicode поддерживает более 100 тысяч символов из нескольких десятков языков. Unicode (также известый как стандарт ISO 10646) является расширением ASCII. В то время как ASCII отводит под каждый символ ровно 1 байт, для Unicode-символа требуется больше. Для обеспечения совместимости между ASCII и Unicode обычно используют кодировку UTF-8 . В ней для ASCII-символов используется как обычно 1 байт (поэтому ASCII-файл также считается корректным файлом в кодировке UTF-8), а для символов других языков и служебных символов — больше.
Хотя UTF-8 и Latin-1 одинаково кодируют ASCII-символы, однако акцентированные и т.п. символы представляются иначе; поэтому чтобы корректно обработать файл, необходимо знать его формат, иначе все символы, не принадлежащие ASCII-таблице, будут искажены.
Давайте посмотрим, как одна строчка на испанском языке («¡Que la Fuerza te acompañe!», что означает «Да пребудет с тобой Сила!») представляется в обоих форматах:
Обратите внимание на символы не из ASCII-таблицы (знак обращенного восклицания в начале и ñ ближе к концу), можно видеть, что в UTF-8 для их кодирования используется два байта, в то время как в Latin-1 всего один. Также видно, что в обоих форматах обычные ASCII-символы кодируются одним байтом.
Требуемая кодировка зависит от используемого приложения. Большинство Linux-программ работают с кодировкой UTF-8, многие другие используют Latin-1, а некоторые обе кодировки сразу. Сначала нужно определить, текст в какой кодировке нужен программе, а затем преобразовывать, если это требуется. К счастью, это можно с легкостью сделать (причем в обоих направлениях), воспользовавшись программой recode .
recode предлагает множество опций (для более подробной справки наберите recode —help или info recode ), ей можно воспользоваться для преобразования текста в разнообразные кодировки (для получения полного списка поддерживаемых кодировок введите recode -l ). Однако для простых преобразований достаточно команд: (на выходе получится текст в кодировке Latin-1 и UTF-8 соответственно)
В зависимости от требуемого преобразования проблема новой строки может устраниться автоматически, однако в особых случаях нужно обращаться к документации (или попробуйте опытным путем, что получится).
Заключение
Преобразование текстовых файлов из других операционных систем — не прямой процесс, однако в Linux для этого есть все средства. Неважно какой формат файла, всегда можно автоматизировать требуемое преобразование и работать с разными несовместимыми форматами.
Источник
Конвертирование файлов в кодировку UTF-8 в Linux
Оригинал: How to Convert Files to UTF-8 Encoding in Linux
Автор: Aaron Kili
Дата публикации: 2 ноября 2016 года
Перевод: А. Кривошей
Дата перевода: ноябрь 2017 г.
В этом руководстве мы рассмотрим кодировки символов и разберем несколько примеров преобразования файлов из одной кодировки в другую с помощью утилиты командной строки. Затем мы покажем, как преобразовать файлы в Linux из любой кодировки (charset) в UTF-8.
Как вы, наверное, уже знаете, компьютер не понимает и не хранит информацию в виде букв, цифр или чего-либо еще. Он работает только с битами. Бит имеет только два возможных значения — 0 или 1, true или false, да или нет. Все остальное кодируется последовательностями битов.
Простыми словами, кодировка символов — это способ кодировки различных символов определенными последовательностями нулей и единиц. Когда мы вводим текст и сохраняем его в файл, слова и предложения, которые мы набираем, состоят из разных символов, а символы преобразуются в биты с помощью кодировки.
Существуют различные схемы кодирования, такие как ASCII, ANSI, Unicode и другие. Ниже приведен пример кодировки ASCII.
В Linux для преобразования текста из одной кодировки в другую используется утилита командной строки iconv.
Вы можете проверить кодировку файла с помощью команды file, используя флаг -i или -mime, который печатает строку типа mime, как в приведенных ниже примерах:
Синтаксис команды iconv следующий:
Где -f или —from-code задает входную кодировку, а -t или —to-encoding задает конечную кодировку.
Для того, чтобы вывести список всех доступных опций, введите:
Конвертирование файлов из UTF-8 в ASCII
Далее мы научимся конвертировать текст из одной кодировки в другую. Приведенная ниже команда преобразует текст из ISO-8859-1 в кодировку UTF-8.
Рассмотрим файл input.file, который содержит следующие символы:
(Прим: вы увидите эти символы на снимке ниже)
Начнем с проверки кодировки файла, затем просмотрим его содержимое. Мы можем преобразовать все символы в кодировку ASCII.
После запуска команды iconv мы затем проверяем содержимое выходного файла и новую кодировку, как показано ниже.
Примечание. Если в команду добавлена строка //IGNORE, то символы, которые не могут быть преобразованы, и ошибка выводятся после преобразования.
Далее, если добавлена строка //TRANSLIT, как в приведенном выше примере (ASCII//TRANSLIT), преобразуемые символы при необходимости и по возможности транслитерируются. Это означает, что если символ не может быть представлен в целевой кодировке, его можно аппроксимировать одним или несколькими похожими символами.
Далее, любой символ, который не может быть транслитерирован и которого нет в целевой кодировке, заменяется в выводе вопросительным знаком (?).
Конвертирование нескольких файлов в кодировку UTF-8
Возвращаясь к основной теме нашей статьи, мы можем написать небольшой скрипт для преобразования нескольких или всех файлов в каталоге в кодировку UTF-8, под названием encoding.sh:
Сохраните этот файл и сделайте скрипт исполняемым. Запускайте его из той директории, где расположены ваши файлы.
Важное замечание. Вы также можете также использовать этот скрипт для преобразования нескольких файлов из одной заданной кодировки в другую (любую), просто меняйте со значения переменных FROM_ENCODING и TO_ENCODING, не забывая об имени выходного файла «$
Для получения дополнительной информации почитайте руководство iconv:
Подводя итог этой статье, необходимо отметить, что понимание способов преобразования текста из одной кодировки в другую — это знания, необходимые каждому пользователю компьютера, а тем более программистам, когда дело касается работы с текстами.
Если вы хотите лучше понять проблему кодировок символов, прочитайте следующие статьи:
Источник
Как определить кодировку файла или строки. Как конвертировать файлы в кодировку UTF-8 в Linux
В этой инструкции мы опишем что такое кодировка символов и рассмотрим несколько примеров конвертации файлов из одной кодировки в другую с использованием инструмента командной строки. Наконец, мы узнаем, как на Linux конвертировать несколько файлов из одного набора символов (charset) в UTF-8 кодировку.
Возможно, вы уже в курсе, что компьютер не понимает и не сохраняет буквы, числа или что-то ещё чем обычно оперируют люди. Компьютер работает с битами. Бит имеет только два возможных значения: 0 или 1, «истина» или «ложь», «да» или «нет». Все другие вещи, вроде букв, цифр, изображений должны быть представлены в битах, чтобы компьютер мог их обрабатывать.
Говоря простыми словами, кодировка символов – это способ информирования компьютера о том, как интерпретировать исходные нули и единицы в реальные символы, где символ представлен набором чисел. Когда мы печатаем текст в файле, слова и предложения, которые мы формируем, готовятся из разных символов, а символы упорядочиваются в кодировку.
Имеются различные схемы кодирования, среди них такие как ASCII, ANSI, Unicode. Ниже пример ASCII кодировки.
Программы для определения кодировки в Linux
Команда file -i показывает неверную кодировку
Чтобы узнать кодировку файла используется команда file с флагами -i или —mime, которые включают вывод строки с типом MIME. Пример:
Команда file показывает кодировки, но для одного из моих файлов она неверна. Рассмотрим ещё одну альтернативу.
Программа enca для определения кодировки файла
Утилита enca определяет кодировку текстовых файлов и, если нужно, конвертирует их.
Установим программу enca:
В этот раз для обоих файлов кодировка определена верно.
Запуск команды без опции выводит что-то вроде:
Это удобно для чтения людьми. Для использования вывода программы в скриптах есть опция -e, она выводит только универсальное имя, используемое в enca:
Если вам нужно имя, которое используется для названия кодировок в iconv, то для этого воспользуйтесь опцией -i:
Для вывода предпочитаемого MIME имени кодировки используется опция -m:
Для правильного определения кодировки программе enca нужно знать язык файла. Она получает эти данные от локали. Получается, если локаль вашей системы отличается от языка документа, то программа не сможет определить кодировку.
Язык документа можно явно указать опцией -L:
Чтобы узнать список доступных языков наберите:
Как определить кодировку строки
Для определения, в какой кодировке строка, используйте одну из следующих конструкций:
Вместо СТРОКА_ДЛЯ_ПРОВЕРКИ впишите строку, для которой нужно узнать кодировку. Если у вас строка не на русском языке, то откорректируйте значение опции -L.
Если возникло сообщение об ошибке:
то попробуйте установить chardet из стандартных репозиториев.
Если chardet не найдена в репозиториях, то поищите программу uchardet, затем установите и используйте её.
Изменение кодировки в Linux
Использование команды iconv
В Linux для конвертации текста из одной кодировки в другую используется команда iconv.
Синтаксис использования iconv имеет следующий вид:
Где -f или —from-code означает кодировку исходного файла -t или —to-encoding указывают кодировку нового файла. Флаг -o является необязательным, если его нет, то содержимое документа в новой кодировке будет показано в стандартном выводе.
Чтобы вывести список всех кодировок, запустите команду:
Конвертирование файлов из windows-1251 в UTF-8 кодировку
Далее мы научимся, как конвертировать файлы из одной схемы кодирования (кодировки) в другую. В качестве примера наша команда будет конвертировать из windows-1251 (которая также называется CP1251) в UTF-8 кодировку.
Допустим, у нас есть файл mypoem_draft.txt его содержимое выводится как
Мы начнём с проверки кодировки символов в файле, просмотрим содержимое файла, выполним конвертирование и просмотрим содержимое файла ещё раз.
Примечание: если к кодировке, в который мы конвертируем файл добавить строку //IGNORE, то символы, которые невозможно конвертировать, будут отбрасываться и после конвертации показана ошибка.
Если к конечной кодировке добавляется строка //TRANSLIT, конвертируемые символы при необходимости и возможности будут транслитерированы. Это означает, когда символ не может быть представлен в целевом наборе символов, он может быть заменён одним или несколькими выглядящими похоже символами. Символы, которые вне целевого набора символов и не могут быть транслитерированы, в выводе заменяются знаком вопроса (?).
Изменение кодировки программой enca
Программа enca не только умеет определять кодировку, но и может конвертировать текстовые файлы в другую кодировку. Особенностью программы является то, что она не создаёт новый файл, а изменяет кодировку в исходном. Желаемую кодировку нужно указать после ключа -x:
Конвертация строки в правильную кодировку
Команда iconv может конвертировать строки в нужную кодировку. Для этого строка передаётся по стандартному вводу. Достаточно использовать только опцию -f для указания кодировки, в которую должна быть преобразована строка. Т.е. используется команда следующего вида:
Также для изменения кодировки применяются программы:
- piconv
- recode
- enconv (другое название enca)
Источник