Linux перекодировать windows 1251 в utf 8

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

В Windows по умочанию используется кодировка символов CP1251, чем иногда доставляет проблем пользователям других, нормальных ОС, которые давно перешли на юникод и забыли о проблемах с кодировками как страшный сон. Но пользователи Windows как американцы, не знают, что существуют другие страны ОС и сохраняют субтитры в CP1251 что делает их нечитабельными для других.

Для решения этой проблемы есть iconv который как раз и служит для перекодировки текстовых файлов из одной кодировки в другую. Во всех почти дистрибутивах данный пакет устанавливается по умолчанию, но если его вдруг не оказалось — установите его с помощью вашего пакетного менеджера.

Для перекодировки достаточно ввести всего одну команду в терминале, а именно:

iconv -f cp1251 -t utf8 /Video/somefile.srt -o /Video/subtitles.srt

Поясню: ключ «f» задает исходную кодировку в которой файл находится сейчас, ключ «t» указывает целевую кодировку, ключ «o» задает путь для сохранения перекодированного файла.

Вот, все очень просто. Так же вы можете таким образом кодировать любые текстовые файлы. Часто и тексты песен попадаются с такой неприятной особенностью. 

Недавно узнал более простой и понятный способ перекодировки текстовых файлов — с помощью enconv.

Не буду приводить полного синтаксиса и описания всех ключей. Для перекодировки достаточно одного, например:

enconv -x UTF-8 somefile.txt

С помощью данной команды мы перегнали текст в UTF-8. Да, именно, просто перегнали без необходимости указания исходной кодировки. Все просто, указываем лишь ту которую хотим получить. Желательно сделать резервную копию файла, так как насколько я понял enconv’у нельзя задать выходной файл и изменяться кодировка будет прямо в исходном файле.

Если у кого то есть еще какие то методы перекодировки текстовых файлов — прошу в каменты.

13 Nov 2016 | Автор: dd |

Перевозил тут пачку сайтов с LAMP на LNAMP, где фронтэндом выступает NGINX. И все бы ничего, если бы не пачка статических сателлитов в кодировке Windows-1251 (cp1251).

Как тут прикололся девака – при анализе сайта, надо сначала чекать кодировку и в случае обнаружения кодировки сайта cp1251 – проверку возраста можно не осуществлять. Но, тем не менее, в инетах до сих пор встречаются такие мастадонты, которые клепают сайты в кодировке CP1251.

Под апачем, при добавлении сайта в ISP Panel это даже не заметишь, а вот при попытке добавить этот же сайт в Vesta CP, получаешь гемор на задницу с крикозябрами. Поэтому надо редактировать конфиг Nginx, предварительно прикрутив туда виндовую кодировку. Но, насколько я помню, у меня этот танец с бубнами не задался и в тот раз, я просто повесил саты на LAMP.

Так что оставалось либо плясать с бубнами вокруг прикручивания виндовой кодировки к NGINX, либо перекодивать файлы в родную для нжинкса UTF-8. Сделать это можно средствами текстового редактора Notepad++ путем перевода кодировки документа и последующего сохранения; либо же в самом линухе.  Как я выше заметил, саты статические, то есть на файлах, без использования базы данных. Поэтому перекодировать надо было именно файлы. С базой данных все происходило бы несколько иначе.

Перекодировка файла из CP1251 в UTF-8 производится в консоли через команду iconv
# iconv -f cp1251 -t utf8 FILE-CP1251 -o FILE-UTF8
либо же можно переписать файл в самого себя
# iconv -f cp1251 -t utf8 file.txt -o file.txt

Но поскольку мне надо было перекодировать большое число файлов php, содержащихся в разных папках, то мне пришлось составить  небольшое предложение:
# find /path-to-files/ -type f -name *php -exec iconv -f cp1251 -t utf-8 '{}' -o '{}' ;

Конвертит все в лет.

Для конвертации кодировок есть еще утилита enconv, входящая в состав пакета enca – вот он как раз конвертит сам в себя по умолчанию, перезаписывая файл выходной кодировкой:
# enconv -c file.txt

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

Rating: 4.4/10 (21 votes cast)

Rating: +1 (from 3 votes)

Смена кодировки сайта из CP1251 на UTF-8, 4.4 out of 10 based on 21 ratings

Теги: centos, сайты

The Linux administrators that work with web hosting know how is it important to keep correct character encoding of the html documents.

From the following article you’ll learn how to check a file’s encoding from the command-line in Linux.

You will also find the best solution to convert text files between different charsets.

I’ll also show the most common examples of how to convert a file’s encoding between CP1251 (Windows-1251, Cyrillic), UTF-8, ISO-8859-1 and ASCII charsets.

Cool Tip: Want see your native language in the Linux terminal? Simply change locale! Read more →

Use the following command to check what encoding is used in a file:

$ file -bi [filename]
Option Description
-b, --brief Don’t print filename (brief mode)
-i, --mime Print filetype and encoding

Check the encoding of the file in.txt:

$ file -bi in.txt
text/plain; charset=utf-8

Change a File’s Encoding

Use the following command to change the encoding of a file:

$ iconv -f [encoding] -t [encoding] -o [newfilename] [filename]
Option Description
-f, --from-code Convert a file’s encoding from charset
-t, --to-code Convert a file’s encoding to charset
-o, --output Specify output file (instead of stdout)

Change a file’s encoding from CP1251 (Windows-1251, Cyrillic) charset to UTF-8:

$ iconv -f cp1251 -t utf-8 in.txt

Change a file’s encoding from ISO-8859-1 charset to and save it to out.txt:

$ iconv -f iso-8859-1 -t utf-8 -o out.txt in.txt

Change a file’s encoding from ASCII to UTF-8:

$ iconv -f utf-8 -t ascii -o out.txt in.txt

Change a file’s encoding from UTF-8 charset to ASCII:

Illegal input sequence at position: As UTF-8 can contain characters that can’t be encoded with ASCII, the iconv will generate the error message “illegal input sequence at position” unless you tell it to strip all non-ASCII characters using the -c option.

$ iconv -c -f utf-8 -t ascii -o out.txt in.txt
Option Description
-c Omit invalid characters from the output

You can lose characters: Note that if you use the iconv with the -c option, nonconvertible characters will be lost.

Very common situation for ones who work inside the both Windows and Linux machines.

This concerns in particular Windows machines with Cyrillic.

You have copied some file from Windows to Linux, but when you open it in Linux, you see “Êàêèå-òî êðàêîçÿáðû” – WTF!?

Don’t panic – such strings can be easily converted from CP1251 (Windows-1251, Cyrillic) charset to UTF-8 with:

$ echo "Êàêèå-òî êðàêîçÿáðû" | iconv -t latin1 | iconv -f cp1251 -t utf-8
Какие-то кракозябры

List All Charsets

List all the known charsets in your Linux system:

$ iconv -l
Option Description
-l, --list List known charsets

@akost

Star

Embed

What would you like to do?

Bash script for recursive file convertion windows-1251 —> utf-8


This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters

Show hidden characters

#!/bin/bash
# Recursive file convertion windows-1251 —> utf-8
# Place this file in the root of your site, add execute permission and run
# Converts *.php, *.html, *.css, *.js files.
# To add file type by extension, e.g. *.cgi, add ‘-o -name «*.cgi»‘ to the find command
find ./ -name «*.php« -o -name «*.html« -o -name «*.css« -o -name «*.js« -type f |
while read file
do
echo « $file«
mv $file $file.icv
iconv -f WINDOWS-1251 -t UTF-8 $file.icv > $file
rm -f $file.icv
done

Смена кодировки файла в LinuxОднажды банально возникла задача поменять кодировку файла с Windows CP-1251 на UTF-8 посредством консоли. Как правило, задача возникает при работе с двумя системами windows и linux. Объяснение этому простое, windows предпочитает работать с текстовыми файлами в кодировке CP-1251, а linux в свою очередь использует кодировку UTF-8. Способов смены кодировки файла оказалось множество, опишу тот, который приглянулся мне.

Существует такая утилита как enconv, она входит в состав пакета enca, который в свою очередь упрощает работу с кодировками файлов.

Итак, для начала неплохо бы узнать, в какой кодировке файл:

# file -i file.txt

Или так

# enca file.txt

Узнав исходную кодировку файла, меняем её с помощью команды:

# iconv -f cp1251 -t utf8 исходный.txt -o конечный.txt

Есть способ, при котором программа сама определит кодировку файла, и преобразует её к кодировке текущей локали:

# enconv file.txt

Преобразовать файл, в кодировку отличную от текущей локали, можно добавив параметр -x:

# enconv -x CP1251 file.txt

Итак, полагаю эта заметка пригодиться в работе, в частности лицам, которым приходиться работать с консолью linux.

Перекодировка текста в Linux. Синтаксис программы iconv

Время создания: 27.04.2019 09:19

Текстовые метки: linux, iconv, bash, кодировка, перекодировка, конвертирование, кракозябры, cp1251, koi8-r, UTF-8

Раздел: Компьютер — Linux — Bash — Кодировки и локализация

Запись: xintrea/mytetra_syncro/master/base/0000001210/text.html на raw.github.com

Программа iconv служит для переконвертирования файлов из одной кодировки в другую.

Узнать, какие кодировки доступны, можно командой

iconv —list

Наиболее часто используемые кодировки — CP1251, KOI8-R, UTF-8, UTF-16.

Синтаксис команды следующий

iconv -f KOI8-R -t CP1251 file.txt

— эта команда будет перекодировать файл file.txt из KOI8-R в CP1251, и результат будет выводить в консоль.

iconv -f KOI8-R -t CP1251 file.txt -o outfile.txt

— эта команда будет перекодировать файл file.txt в файл outfile.txt.

Внимание! В качестве выходного файла нельзя указывать исходный файл, так как в этом случае исходный файл будет обнулен. Для того чтобы переконвертировать файл, не создавая новый файл, можно использовать команду вида

iconv -f KOI8-R -t CP1251 file -o tmpfile && mv tmpfile file

Пример скрипта, который переконвертирует файлы в директории и её поддиректориях:

f=`find . -name *.cpp -or -name *.c -or -name *.h`

for file in $f

do

iconv -f KOI8-R -t UTF8 $file -o tmpfile && mv tmpfile $file

done

Содержание

  1. Как определить кодировку файла или строки. Как конвертировать файлы в кодировку UTF-8 в Linux
  2. Программы для определения кодировки в Linux
  3. Программа enca для определения кодировки файла
  4. Как определить кодировку строки
  5. Изменение кодировки в Linux
  6. Использование команды iconv
  7. Конвертирование файлов из windows-1251 в UTF-8 кодировку
  8. Изменение кодировки программой enca
  9. Конвертация строки в правильную кодировку
  10. Конвертирование файлов в кодировку UTF-8 в Linux
  11. Конвертирование файлов из UTF-8 в ASCII
  12. Конвертирование нескольких файлов в кодировку UTF-8
  13. Перекодировка из cp1251 в UTF8
  14. linux узнать кодировку файла
  15. iconv и большие файлы
  16. Как узнать кодировку файла в Ubuntu Linux: 5 комментариев
  17. Программы для определения кодировки в Linux
  18. Программа enca для определения кодировки файла
  19. Как определить кодировку строки
  20. Изменение кодировки в Linux
  21. Использование команды iconv
  22. Конвертирование файлов из windows-1251 в UTF-8 кодировку
  23. Изменение кодировки программой enca
  24. Конвертация строки в правильную кодировку
  25. iconv
  26. Описание
  27. Список параметров
  28. Возвращаемые значения
  29. Примеры
  30. User Contributed Notes 39 notes

Как определить кодировку файла или строки. Как конвертировать файлы в кодировку UTF-8 в Linux

В этой инструкции мы опишем что такое кодировка символов и рассмотрим несколько примеров конвертации файлов из одной кодировки в другую с использованием инструмента командной строки. Наконец, мы узнаем, как на Linux конвертировать несколько файлов из одного набора символов (charset) в UTF-8 кодировку.

Возможно, вы уже в курсе, что компьютер не понимает и не сохраняет буквы, числа или что-то ещё чем обычно оперируют люди. Компьютер работает с битами. Бит имеет только два возможных значения: 0 или 1, «истина» или «ложь», «да» или «нет». Все другие вещи, вроде букв, цифр, изображений должны быть представлены в битах, чтобы компьютер мог их обрабатывать.

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

Имеются различные схемы кодирования, среди них такие как ASCII, ANSI, Unicode. Ниже пример ASCII кодировки.

Программы для определения кодировки в Linux

Чтобы узнать кодировку файла используется команда file с флагами -i или —mime, которые включают вывод строки с типом MIME. Пример:

Команда file показывает кодировки, но для одного из моих файлов она неверна. Рассмотрим ещё одну альтернативу.

Программа enca для определения кодировки файла

Утилита enca определяет кодировку текстовых файлов и, если нужно, конвертирует их.

Установим программу enca:

В этот раз для обоих файлов кодировка определена верно.

Запуск команды без опции выводит что-то вроде:

Это удобно для чтения людьми. Для использования вывода программы в скриптах есть опция -e, она выводит только универсальное имя, используемое в enca:

Если вам нужно имя, которое используется для названия кодировок в iconv, то для этого воспользуйтесь опцией -i:

Для вывода предпочитаемого MIME имени кодировки используется опция -m:

x24.jpg.pagespeed.ic.2v44582Ga

Для правильного определения кодировки программе enca нужно знать язык файла. Она получает эти данные от локали. Получается, если локаль вашей системы отличается от языка документа, то программа не сможет определить кодировку.

Язык документа можно явно указать опцией -L:

Чтобы узнать список доступных языков наберите:

Как определить кодировку строки

Для определения, в какой кодировке строка, используйте одну из следующих конструкций:

Вместо СТРОКА_ДЛЯ_ПРОВЕРКИ впишите строку, для которой нужно узнать кодировку. Если у вас строка не на русском языке, то откорректируйте значение опции -L.

01

Если возникло сообщение об ошибке:

то попробуйте установить chardet из стандартных репозиториев.

Если chardet не найдена в репозиториях, то поищите программу uchardet, затем установите и используйте её.

Изменение кодировки в Linux

Использование команды iconv

В Linux для конвертации текста из одной кодировки в другую используется команда iconv.

Синтаксис использования iconv имеет следующий вид:

Где -f или —from-code означает кодировку исходного файла -t или —to-encoding указывают кодировку нового файла. Флаг -o является необязательным, если его нет, то содержимое документа в новой кодировке будет показано в стандартном выводе.

Чтобы вывести список всех кодировок, запустите команду:

22

Конвертирование файлов из windows-1251 в UTF-8 кодировку

Далее мы научимся, как конвертировать файлы из одной схемы кодирования (кодировки) в другую. В качестве примера наша команда будет конвертировать из windows-1251 (которая также называется CP1251) в UTF-8 кодировку.

Допустим, у нас есть файл mypoem_draft.txt его содержимое выводится как

Мы начнём с проверки кодировки символов в файле, просмотрим содержимое файла, выполним конвертирование и просмотрим содержимое файла ещё раз.

25

Примечание: если к кодировке, в который мы конвертируем файл добавить строку //IGNORE, то символы, которые невозможно конвертировать, будут отбрасываться и после конвертации показана ошибка.

Если к конечной кодировке добавляется строка //TRANSLIT, конвертируемые символы при необходимости и возможности будут транслитерированы. Это означает, когда символ не может быть представлен в целевом наборе символов, он может быть заменён одним или несколькими выглядящими похоже символами. Символы, которые вне целевого набора символов и не могут быть транслитерированы, в выводе заменяются знаком вопроса (?).

Изменение кодировки программой enca

Программа enca не только умеет определять кодировку, но и может конвертировать текстовые файлы в другую кодировку. Особенностью программы является то, что она не создаёт новый файл, а изменяет кодировку в исходном. Желаемую кодировку нужно указать после ключа -x:

Конвертация строки в правильную кодировку

Команда iconv может конвертировать строки в нужную кодировку. Для этого строка передаётся по стандартному вводу. Достаточно использовать только опцию -f для указания кодировки, в которую должна быть преобразована строка. Т.е. используется команда следующего вида:

02

Также для изменения кодировки применяются программы:

Источник

Конвертирование файлов в кодировку UTF-8 в Linux

Оригинал: How to Convert Files to UTF-8 Encoding in Linux
Автор: Aaron Kili
Дата публикации: 2 ноября 2016 года
Перевод: А. Кривошей
Дата перевода: ноябрь 2017 г.

В этом руководстве мы рассмотрим кодировки символов и разберем несколько примеров преобразования файлов из одной кодировки в другую с помощью утилиты командной строки. Затем мы покажем, как преобразовать файлы в Linux из любой кодировки (charset) в UTF-8.

Существуют различные схемы кодирования, такие как ASCII, ANSI, Unicode и другие. Ниже приведен пример кодировки ASCII.

Check File Encoding in

Синтаксис команды iconv следующий:

Для того, чтобы вывести список всех доступных опций, введите:

List Coded Charsets in

Конвертирование файлов из UTF-8 в ASCII

Далее мы научимся конвертировать текст из одной кодировки в другую. Приведенная ниже команда преобразует текст из ISO-8859-1 в кодировку UTF-8.

Рассмотрим файл input.file, который содержит следующие символы:

(Прим: вы увидите эти символы на снимке ниже)

Начнем с проверки кодировки файла, затем просмотрим его содержимое. Мы можем преобразовать все символы в кодировку ASCII.
После запуска команды iconv мы затем проверяем содержимое выходного файла и новую кодировку, как показано ниже.

Converts UTF8 to ASCII in

Примечание. Если в команду добавлена строка //IGNORE, то символы, которые не могут быть преобразованы, и ошибка выводятся после преобразования.

Далее, если добавлена строка //TRANSLIT, как в приведенном выше примере (ASCII//TRANSLIT), преобразуемые символы при необходимости и по возможности транслитерируются. Это означает, что если символ не может быть представлен в целевой кодировке, его можно аппроксимировать одним или несколькими похожими символами.

Далее, любой символ, который не может быть транслитерирован и которого нет в целевой кодировке, заменяется в выводе вопросительным знаком (?).

Конвертирование нескольких файлов в кодировку UTF-8

Возвращаясь к основной теме нашей статьи, мы можем написать небольшой скрипт для преобразования нескольких или всех файлов в каталоге в кодировку UTF-8, под названием encoding.sh:

Сохраните этот файл и сделайте скрипт исполняемым. Запускайте его из той директории, где расположены ваши файлы.

Для получения дополнительной информации почитайте руководство iconv:

Если вы хотите лучше понять проблему кодировок символов, прочитайте следующие статьи:

Источник

Перекодировка из cp1251 в UTF8

62645: 1322432621

40363:319351035

55759:1719334773

5280: 42768188

46329:1333550949

49594: 276606704

«man recode» и к тебе относится.

recode cp1251..utf8 *.txt

43755:2064863919

а man enconv относится к тебе.

49594: 276606704

если я знаю из какой кодировки в какую мне надо перевести, то эвристика enca мне не нужна. А для собственно перекодировки recode подходит лучше.

Txt книжки можно фаерфоксом открывать. Он автоматически распознаёт кодировки.

43755:2064863919

49594: 276606704

в твоём варианте откуда он догадается что надо перекодировать В utf8? Из локали возьмёт? Ну тогда

43755:2064863919

из переменной, указанной в

62645: 1322432621

Как запустить рекурсивную перекодировку всех txt файлов?
они не в одной директории, есть много под директорий..

43755:2064863919

Источник

linux узнать кодировку файла

Давно в категории «Ubuntu» у меня не было материалов. Сегодня я исправлюсь и выпущу сразу две статьи. Итак, начнём. вам приходилось менять кодировку текстовых файлов в linux’e? А что если объем такого файла больше 10 Gb?!

Что бы изменить кодировку файла нужно использовать замечательную утилиту iconv. В параметрах необходимо указывать исходную кодировку, а в этом нам поможет команда:

Ну а далее вот такие действия:

Остальные ключики как обычно в man iconv.

iconv и большие файлы

Для быстрого выполнения процесса кодировки, iconv загружает файл в оперативную память и в swap. Но это работает только для небольших файлов. Если файл уж совсем большой, а ОЗУ не особо, то вы прост получите ошибку, мол «слишком большой файл», звиняйте хлопцы. Где взять такой файл? К примеру это может быть выборка из БД ( игры для ipad, PC, PSP или другие данные)

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

В простом варианте чтобы разбить файл на куски объёмом по 1Gb выполнить:

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

Как узнать кодировку файла в Ubuntu Linux: 5 комментариев

�� Тоже недавно наткнулся на этот совет.. Обязательно поможет кому нибудь…

В этой инструкции мы опишем что такое кодировка символов и рассмотрим несколько примеров конвертации файлов из одной кодировки в другую с использованием инструмента командной строки. Наконец, мы узнаем, как на Linux конвертировать несколько файлов из одного набора символов (charset) в UTF-8 кодировку.

Возможно, вы уже в курсе, что компьютер не понимает и не сохраняет буквы, числа или что-то ещё чем обычно оперируют люди. Компьютер работает с битами. Бит имеет только два возможных значения: 0 или 1, «истина» или «ложь», «да» или «нет». Все другие вещи, вроде букв, цифр, изображений должны быть представлены в битах, чтобы компьютер мог их обрабатывать.

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

Имеются различные схемы кодирования, среди них такие как ASCII, ANSI, Unicode. Ниже пример ASCII кодировки.

Программы для определения кодировки в Linux

Чтобы узнать кодировку файла используется команда file с флагами -i или —mime, которые включают вывод строки с типом MIME. Пример:

21

Команда file показывает кодировки, но для одного из моих файлов она неверна. Рассмотрим ещё одну альтернативу.

Программа enca для определения кодировки файла

Утилита enca определяет кодировку текстовых файлов и, если нужно, конвертирует их.

Установим программу enca:

23

В этот раз для обоих файлов кодировка определена верно.

Запуск команды без опции выводит что-то вроде:

Это удобно для чтения людьми. Для использования вывода программы в скриптах есть опция -e, она выводит только универсальное имя, используемое в enca:

Если вам нужно имя, которое используется для названия кодировок в iconv, то для этого воспользуйтесь опцией -i:

Для вывода предпочитаемого MIME имени кодировки используется опция -m:

24

Для правильного определения кодировки программе enca нужно знать язык файла. Она получает эти данные от локали. Получается, если локаль вашей системы отличается от языка документа, то программа не сможет определить кодировку.

Язык документа можно явно указать опцией -L:

Чтобы узнать список доступных языков наберите:

Как определить кодировку строки

Для определения, в какой кодировке строка, используйте одну из следующих конструкций:

Вместо СТРОКА_ДЛЯ_ПРОВЕРКИ впишите строку, для которой нужно узнать кодировку. Если у вас строка не на русском языке, то откорректируйте значение опции -L.

01

Если возникло сообщение об ошибке:

то попробуйте установить chardet из стандартных репозиториев.

Если chardet не найдена в репозиториях, то поищите программу uchardet, затем установите и используйте её.

Изменение кодировки в Linux

Использование команды iconv

В Linux для конвертации текста из одной кодировки в другую используется команда iconv.

Синтаксис использования iconv имеет следующий вид:

Где -f или —from-code означает кодировку исходного файла -t или —to-encoding указывают кодировку нового файла. Флаг -o является необязательным, если его нет, то содержимое документа в новой кодировке будет показано в стандартном выводе.

Чтобы вывести список всех кодировок, запустите команду:

22

Конвертирование файлов из windows-1251 в UTF-8 кодировку

Далее мы научимся, как конвертировать файлы из одной схемы кодирования (кодировки) в другую. В качестве примера наша команда будет конвертировать из windows-1251 (которая также называется CP1251) в UTF-8 кодировку.

Допустим, у нас есть файл mypoem_draft.txt его содержимое выводится как

Мы начнём с проверки кодировки символов в файле, просмотрим содержимое файла, выполним конвертирование и просмотрим содержимое файла ещё раз.

25

Примечание: если к кодировке, в который мы конвертируем файл добавить строку //IGNORE, то символы, которые невозможно конвертировать, будут отбрасываться и после конвертации показана ошибка.

Если к конечной кодировке добавляется строка //TRANSLIT, конвертируемые символы при необходимости и возможности будут транслитерированы. Это означает, когда символ не может быть представлен в целевом наборе символов, он может быть заменён одним или несколькими выглядящими похоже символами. Символы, которые вне целевого набора символов и не могут быть транслитерированы, в выводе заменяются знаком вопроса (?).

Изменение кодировки программой enca

Программа enca не только умеет определять кодировку, но и может конвертировать текстовые файлы в другую кодировку. Особенностью программы является то, что она не создаёт новый файл, а изменяет кодировку в исходном. Желаемую кодировку нужно указать после ключа -x:

Конвертация строки в правильную кодировку

Команда iconv может конвертировать строки в нужную кодировку. Для этого строка передаётся по стандартному вводу. Достаточно использовать только опцию -f для указания кодировки, в которую должна быть преобразована строка. Т.е. используется команда следующего вида:

02

Также для изменения кодировки применяются программы:

Источник

iconv

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

iconv — Преобразование строки в требуемую кодировку

Описание

Список параметров

Кодировка входной строки.

Требуемая на выходе кодировка.

Строка, которую необходимо преобразовать.

Возвращаемые значения

Возвращает преобразованную строку или false в случае возникновения ошибки.

Примеры

Пример #1 Пример использования iconv()

Результатом выполнения данного примера будет что-то подобное:

User Contributed Notes 39 notes

The «//ignore» option doesn’t work with recent versions of the iconv library. So if you’re having trouble with that option, you aren’t alone.

That means you can’t currently use this function to filter invalid characters. Instead it silently fails and returns an empty string (or you’ll get a notice but only if you have E_NOTICE enabled).

[UPDATE 15-JUN-2012]
Here’s a workaround.

ini_set(‘mbstring.substitute_character’, «none»);
$text= mb_convert_encoding($text, ‘UTF-8’, ‘UTF-8’);

That will strip invalid characters from UTF-8 strings (so that you can insert it into a database, etc.). Instead of «none» you can also use the value 32 if you want it to insert spaces in place of the invalid characters.

Interestingly, setting different target locales results in different, yet appropriate, transliterations. For example:

//some German
$utf8_sentence = ‘Weiß, Goldmann, Göbel, Weiss, Göthe, Goethe und Götz’ ;

to test different combinations of convertions between charsets (when we don’t know the source charset and what is the convenient destination charset) this is an example :

Like many other people, I have encountered massive problems when using iconv() to convert between encodings (from UTF-8 to ISO-8859-15 in my case), especially on large strings.

The main problem here is that when your string contains illegal UTF-8 characters, there is no really straight forward way to handle those. iconv() simply (and silently!) terminates the string when encountering the problematic characters (also if using //IGNORE), returning a clipped string. The

?>

workaround suggested here and elsewhere will also break when encountering illegal characters, at least dropping a useful note («htmlentities(): Invalid multibyte sequence in argument in. «)

I have found a lot of hints, suggestions and alternative methods (it’s scary and in my opinion no good sign how many ways PHP natively provides to convert the encoding of strings), but none of them really worked, except for this one:

If you are getting question-marks in your iconv output when transliterating, be sure to ‘setlocale’ to something your system supports.

Some PHP CMS’s will default setlocale to ‘C’, this can be a problem.

use the «locale» command to find out a list..

For those who have troubles in displaying UCS-2 data on browser, here’s a simple function that convert ucs2 to html unicode entities :

Here is how to convert UCS-2 numbers to UTF-8 numbers in hex:

echo strtoupper ( ucs2toutf8 ( «06450631062D0020» ));

?>

Input:
06450631062D
Output:
D985D8B1D8AD

If you want to convert to a Unicode encoding without the byte order mark (BOM), add the endianness to the encoding, e.g. instead of «UTF-16» which will add a BOM to the start of the string, use «UTF-16BE» which will convert the string without adding a BOM.

I just found out today that the Windows and *NIX versions of PHP use different iconv libraries and are not very consistent with each other.

Here is a repost of my earlier code that now works on more systems. It converts as much as possible and replaces the rest with question marks:

I use this function that does’nt need any extension :

I have not tested it extensively, hope it may help.

I have used iconv to convert from cp1251 into UTF-8. I spent a day to investigate why a string with Russian capital ‘Р’ (sounds similar to ‘r’) at the end cannot be inserted into a database.

The problem is not in iconv. But ‘Р’ in cp1251 is chr(208) and ‘Р’ in UTF-8 is chr(208).chr(106). chr(106) is one of the space symbol which match ‘s’ in regex. So, it can be taken by a greedy ‘+’ or ‘*’ operator. In that case, you loose ‘Р’ in your string.

For example, ‘ГР ‘ (Russian, UTF-8). Function preg_match. Regex is ‘(.+?)[s]*’. Then ‘(.+?)’ matches ‘Г’.chr(208) and ‘[s]*’ matches chr(106).’ ‘.

Although, it is not a bug of iconv, but it looks like it very much. That’s why I put this comment here.

Here is an example how to convert windows-1251 (windows) or cp1251(Linux/Unix) encoded string to UTF-8 encoding.

Источник

$ file -i file.txt
file.txt: text/plain; charset=us-ascii

Давно в категории «Ubuntu» у меня не было материалов. Сегодня я исправлюсь и выпущу сразу две статьи. Итак, начнём. вам приходилось менять кодировку текстовых файлов в linux’e? А что если объем такого файла больше 10 Gb?!

Что бы изменить кодировку файла нужно использовать замечательную утилиту iconv. В параметрах необходимо указывать исходную кодировку

Как узнать кодировку файла в Linux

В этом нам поможет команда file:

$ file file.txt
file.txt: ASCII text, with no line terminators

Но лучше сразу с ключом -i.

$ file -i file.txt
file.txt: text/plain; charset=us-ascii

Ну а далее вот такие действия:

iconv -f WINDOWS-1251 -t UTF-8 -o output_file.txt original_file.txt

где

  • -f WINDOWS-1251 - исходная кодировка, список исходных кодировок iconv -l, в команде работает tab, чтобы не опечататься
  • -t UTF-8 - конечная
  • -o output_file.txt - куда выводить результат
  • original_file.txt - исходный файл

Остальные ключики как обычно в man iconv.

iconv и большие файлы

Для быстрого выполнения процесса кодировки, iconv загружает файл в оперативную память и в swap. Но это работает только для небольших файлов. Если файл уж совсем большой, а ОЗУ не особо, то вы прост получите ошибку, мол «слишком большой файл», звиняйте хлопцы. Где взять такой файл? К примеру это может быть выборка из БД (игры для ipad, PC, PSP или другие данные)

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

В простом варианте чтобы разбить файл на куски объёмом по 1Gb выполнить:

split -b 1000000000 file.txt

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

First answer

#!/bin/bash

find "<YOUR_FOLDER_PATH>" -name '*' -type f -exec grep -Iq . {} ; -print0 |
while IFS= read -r -d $'' LINE_FILE; do
  CHARSET=$(uchardet $LINE_FILE)
  echo "Converting ($CHARSET) $LINE_FILE"

  # NOTE: Convert/reconvert to utf8. By Questor
  iconv -f "$CHARSET" -t utf8 "$LINE_FILE" -o "$LINE_FILE"

  # NOTE: Remove "BOM" if exists as it is unnecessary. By Questor
  # [Refs.: https://stackoverflow.com/a/2223926/3223785 ,
  # https://stackoverflow.com/a/45240995/3223785 ]
  sed -i '1s/^xEFxBBxBF//' "$LINE_FILE"

done
# [Refs.: https://justrocketscience.com/post/handle-encodings ,
# https://stackoverflow.com/a/9612232/3223785 ,
# https://stackoverflow.com/a/13659891/3223785 ]

FURTHER QUESTION: I do not know if my approach is the safest. I say this because I noticed that some files are not correctly converted (characters will be lost) or are «truncated». I suspect that this has to do with the «iconv» tool or with the charset information obtained with the «uchardet» tool. I was curious about the solution presented by @demofly because it could be safer.

Another answer

Based on @demofly ‘s answer:

#!/bin/bash

find "<YOUR_FOLDER_PATH>" -name '*' -type f -exec grep -Iq . {} ; -print0 |
while IFS= read -r -d $'' LINE_FILE; do
  CHARSET=$(uchardet $LINE_FILE)
  REENCSED=`echo $CHARSET | sed 's#^x-mac-#mac#'`
  echo ""$CHARSET" "$LINE_FILE""

  # NOTE: Convert/reconvert to utf8. By Questor
  recode $REENCSED..UTF-8 "$LINE_FILE" 2> STDERR_OP 1> STDOUT_OP

  STDERR_OP=$(cat STDERR_OP)
  rm -f STDERR_OP
  if [ -n "$STDERR_OP" ] ; then

    # NOTE: Convert/reconvert to utf8. By Questor
    iconv -f "$CHARSET" -t utf8 "$LINE_FILE" -o "$LINE_FILE" 2> STDERR_OP 1> STDOUT_OP

    STDERR_OP=$(cat STDERR_OP)
    rm -f STDERR_OP
  fi

  # NOTE: Remove "BOM" if exists as it is unnecessary. By Questor
  # [Refs.: https://stackoverflow.com/a/2223926/3223785 ,
  # https://stackoverflow.com/a/45240995/3223785 ]
  sed -i '1s/^xEFxBBxBF//' "$LINE_FILE"

  if [ -n "$STDERR_OP" ] ; then
    echo "ERROR: "$STDERR_OP""
  fi
  STDOUT_OP=$(cat STDOUT_OP)
  rm -f STDOUT_OP
  if [ -n "$STDOUT_OP" ] ; then
    echo "RESULT: "$STDOUT_OP""
  fi
done
# [Refs.: https://justrocketscience.com/post/handle-encodings ,
# https://stackoverflow.com/a/9612232/3223785 ,
# https://stackoverflow.com/a/13659891/3223785 ]

Third answer

Hybrid solution with recode and vim:

#!/bin/bash

find "<YOUR_FOLDER_PATH>" -name '*' -type f -exec grep -Iq . {} ; -print0 |
while IFS= read -r -d $'' LINE_FILE; do
  CHARSET=$(uchardet $LINE_FILE)
  REENCSED=`echo $CHARSET | sed 's#^x-mac-#mac#'`
  echo ""$CHARSET" "$LINE_FILE""

  # NOTE: Convert/reconvert to utf8. By Questor
  recode $REENCSED..UTF-8 "$LINE_FILE" 2> STDERR_OP 1> STDOUT_OP

  STDERR_OP=$(cat STDERR_OP)
  rm -f STDERR_OP
  if [ -n "$STDERR_OP" ] ; then

    # NOTE: Convert/reconvert to utf8. By Questor
    bash -c "</dev/tty vim -u NONE +"set binary | set noeol | set nobomb | set encoding=utf-8 | set fileencoding=utf-8 | wq" "$LINE_FILE""

  else

    # NOTE: Remove "BOM" if exists as it is unnecessary. By Questor
    # [Refs.: https://stackoverflow.com/a/2223926/3223785 ,
    # https://stackoverflow.com/a/45240995/3223785 ]
    sed -i '1s/^xEFxBBxBF//' "$LINE_FILE"

  fi
done

This was the solution with the highest number of perfect conversions. Additionally, we did not have any truncated files.


  • WARNING: Make a backup of your files and use a merge tool to check/compare the changes. Problems probably will appear!
  • TIP: The command sed -i '1s/^xEFxBBxBF//' "$LINE_FILE" can be executed after a preliminary comparison with the merge tool after a conversion without it since it can cause «differences».
  • NOTE: The search using find brings all non-binary files from the given path («») and its subfolders.

Ответ на:

комментарий
от Neclude 28.04.10 18:47:06 MSD

man bash

svu ★★★★★

(28.04.10 18:50:12 MSD)

  • Ссылка

for FILE in $(find /some/path -name ‘*.txt’); do mv $FILE{,.orig} && iconv -f CP1251 -t UTF-8 $FILE.orig -o $FILE; done

Cancellor ★★★★☆

(28.04.10 18:53:50 MSD)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от Cancellor 28.04.10 18:53:50 MSD

> mv $FILE{,.orig} && iconv -f CP1251 -t UTF-8 $FILE.orig -o $FILE

«man recode» и к тебе относится.

recode cp1251..utf8 *.txt

pupok ★★

(28.04.10 22:35:24 MSD)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от pupok 28.04.10 22:35:24 MSD

Ответ на:

комментарий
от NekoExMachina 29.04.10 03:36:06 MSD

если я знаю из какой кодировки в какую мне надо перевести, то эвристика enca мне не нужна. А для собственно перекодировки recode подходит лучше.

pupok ★★

(29.04.10 05:40:08 MSD)

  • Показать ответ
  • Ссылка

Txt книжки можно фаерфоксом открывать. Он автоматически распознаёт кодировки.

  • Ссылка

Ответ на:

комментарий
от pupok 29.04.10 05:40:08 MSD

enconv -L russian *txt
recode cp1251..utf8 *.txt
во втором варианте символов больше :D

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от NekoExMachina 29.04.10 12:51:55 MSD

в твоём варианте откуда он догадается что надо перекодировать В utf8? Из локали возьмёт? Ну тогда

recode cp1251 *.txt

и символов меньше.

pupok ★★

(29.04.10 16:51:31 MSD)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от pupok 29.04.10 16:51:31 MSD

Ответ на:

комментарий
от NekoExMachina 29.04.10 16:57:19 MSD

Как запустить рекурсивную перекодировку всех txt файлов?
они не в одной директории, есть много под директорий..

ANGELOS

(29.04.10 18:30:51 MSD)

  • Показать ответ
  • Ссылка

Ответ на:

комментарий
от ANGELOS 29.04.10 18:30:51 MSD

find /path/to/dir -iname ‘*.txt’ -exec recode cp1251..utf8 {} ;

  • Ссылка

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.

Понравилась статья? Поделить с друзьями:
  • Linux ножницы как в windows 7
  • Lines 3000 скачать бесплатно для windows 10
  • Linux для старых ноутбуков похожих на windows
  • Linux не видит загрузочную флешку с windows
  • Lineage 2 не запускается на windows 10 на ноутбуке