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

Какой самый быстрый и простой инструмент или метод для преобразования текстовых файлов между наборами символов?

В частности, мне нужно конвертировать из UTF-8 в ISO-8859-15 и наоборот.

Все идет: одна строка на вашем любимом языке сценариев, инструменты командной строки или другие утилиты для ОС, веб-сайтов и т. Д.

Лучшие решения на данный момент:

В Linux / UNIX / OS X / cygwin:

  • Gnu iconv, предложенный Troels Arvin , лучше всего использовать в качестве фильтра . Кажется, это универсально доступно. Пример:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    Как отметил Бен , есть онлайн-конвертер, использующий iconv .

  • Gnu перекодировать ( ручной ) , предложенной Cheekysoft преобразует один или несколько файлов на месте . Пример:

    $ recode UTF8..ISO-8859-15 in.txt
    

    Этот использует более короткие псевдонимы:

    $ recode utf8..l9 in.txt
    

    Recode также поддерживает поверхности, которые можно использовать для преобразования между различными типами окончания строки и кодированием:

    Преобразовать переводы строк из LF (Unix) в CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    Файл кодирования Base64:

    $ recode ../Base64 in.txt
    

    Вы также можете объединить их.

    Преобразуйте файл UTF8 в кодировке Base64 с окончаниями строк Unix в файл Latin 1 в кодировке Base64 с окончаниями строк Dos:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

В Windows с Powershell ( Джей Базузи ):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (Однако поддержка ISO-8859-15 не поддерживается; в нем говорится, что поддерживаются кодировки unicode, utf7, utf8, utf32, ascii, bigendianunicode, default и oem.)

редактировать

Вы имеете в виду поддержку iso-8859-1? Использование «String» делает это, например, для наоборот

gc -en string in.txt | Out-File -en utf8 out.txt

Примечание. Возможные значения перечисления: «Неизвестно, Строка, Юникод, Байт, BigEndianUnicode, UTF8, UTF7, Ascii».

15.09.2008 17:21:31
Я пытался, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlно он конвертирует файл в UTF-8, но тогда он пуст! Notepad ++ говорит, что файл в формате Ansi, но, как я понимаю, читается, что это даже не правильный набор символов ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE 13.09.2013 12:24:17
Просто наткнуться на это в поисках ответа на связанный вопрос - отличное резюме! Просто подумал, что стоит добавить, что он recodeбудет действовать как фильтр, если вы не передадите ему имя файла, например:recode utf8..l9 < in.txt > out.txt
Jez 6.03.2014 11:05:18
iconv.com/iconv.htm кажется мне мертвым? (тайм-аут)
Andrew Newby 12.05.2014 06:51:37
Если вы используете enca, вам не нужно указывать кодировку ввода. Достаточно часто просто указать язык: enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev 31.07.2015 19:04:50
На самом деле, iconv работал намного лучше как конвертер на месте вместо фильтра. Преобразование файла с более чем 2 миллионами строк с использованием iconv -f UTF-32 -t UTF-8 input.csv > output.csvсохраненных только около семисот тысяч строк, только трети. С помощью версии на месте iconv -f UTF-32 -t UTF-8 file.csvуспешно преобразуются все 2 миллиона плюс строк.
Nicolay77 19.05.2016 23:04:31
17 ОТВЕТОВ

Iconv (1)

iconv -f FROM-ENCODING -t TO-ENCODING file.txt

Также есть инструменты на основе iconv на многих языках.

21
25.09.2015 22:06:53
Как насчет автоматического определения оригинальной кодировки?
Aaron Franke 19.03.2020 20:55:12

В Linux вы можете использовать очень мощную команду recode, чтобы попытаться преобразовать различные кодировки, а также любые проблемы с окончанием строки. recode -l покажет вам все форматы и кодировки, между которыми инструмент может конвертироваться. Вероятно, это будет ОЧЕНЬ длинный список.

39
15.09.2008 17:24:18
Как вы конвертируете в LF? Есть /CRи /CR-LFнет/LF
Aaron Franke 19.03.2020 20:56:13

Автономный сервисный подход

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

Вам не нужно указывать ни один из этих аргументов. По умолчанию они будут соответствовать вашей текущей локали (обычно это UTF-8).

244
2.02.2019 23:58:15
Для всех остальных, кто запутался из-за недоступности не-тире версий, похоже, что версии iconv для OSX (и, возможно, все BSD) не поддерживают псевдонимы без тире для различных кодировок UTF- *. iconv -l | grep UTFрасскажет вам обо всех UTF-кодировках, которые поддерживает ваша копия iconv.
coredumperror 2.05.2012 19:10:32
Не знаете кодировку вашего входного файла? Используйте chardet in.txtдля генерации лучшего предположения. Результат можно использовать как ENCODING в iconv -f ENCODING.
Stew 16.09.2014 16:45:28
Предотвращение выхода на недопустимые символы (избегая illegal input sequence at positionсообщений), и заменить «странные» символы с «похожими» символы: iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
knb 6.02.2015 11:07:56
Мне это нравится, потому что это стандарт на большинстве платформ NIX. Но также смотрите опцию командной VIM (псевдоним: ex) ниже . Дополнительная информация: (1) вам (вероятно) не нужно указывать параметр -f(from) с помощью iconv. (2) file --mime-encoding <file/s>команда может помочь вам выяснить кодировку в первую очередь.
fr13d 15.01.2016 11:37:12
FWIW fileкоманда сообщила, что мой источник UTF-16 Little Endian; работает iconv -f UTF-16 -t UTF-8...неправильно преобразовал его в ASCII, я должен был явно указать, iconv -f UTF-16LE...чтобы вывести UTF-8
Plato 14.12.2016 23:04:31
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

Кратчайшая версия, если вы можете предположить, что входная спецификация верна:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt
20
27.02.2014 15:28:12
Вот более короткая версия, которая работает лучше. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle 15.07.2012 06:16:09
@LarryBattle: Как Set-Contentработает лучше, чем Out-File?
Jay Bazuzi 15.07.2012 19:30:21
...ой. Я думаю, что они почти одно и то же. У меня были проблемы с запуском вашего примера, потому что я предполагал, что обе версии использовали один и тот же file-utf8.txtфайл для ввода, так как они имели одинаковый выходной файл file-utf7.txt.
Larry Battle 15.07.2012 21:24:29
Это было бы действительно здорово, за исключением того, что он не поддерживает UTF16. Он поддерживает UTF32, но не UTF16! Мне не нужно было бы конвертировать файлы, за исключением того, что большая часть программного обеспечения Microsoft (например, SQL Server bcp) настаивает на UTF16 - и тогда их утилита не преобразуется в него. Интересно, мягко говоря.
Noah 22.08.2013 01:45:45
Я пытался, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlно он конвертирует файл в UTF-8, но тогда он пуст! Notepad ++ говорит, что файл в формате Ansi, но, как я понимаю, читается, что это даже не правильный набор символов ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE 13.09.2013 12:23:49

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);

3
17.09.2008 06:18:34
Это утверждение прекрасно работает при преобразовании строк, но не для файлов.
jjwdesign 3.10.2016 13:36:12

Попробуйте функцию iconv Bash

Я положил это в .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

.. чтобы иметь возможность конвертировать файлы так:

utf8 MyClass.java
16
27.10.2016 10:19:58
лучше использовать tmp = $ (mktmp) для создания временного файла. Кроме того, строка с rm является избыточной.
LMZ 26.02.2015 22:20:39
Вы можете выполнить эту функцию с автоопределением формата ввода?
mlibre 20.04.2016 20:28:09
будьте осторожны, эта функция удаляет входной файл без проверки того, что вызов iconv завершился успешно.
philwalk 5.12.2017 19:48:07
Это изменяет содержимое текстового файла. Я запустил это на UTF-8 с BOM, ожидая получить UTF-8 без файла BOM, но он был добавлен в начале файла.
Aaron Franke 19.03.2020 20:53:54

Попробуйте Notepad ++

В Windows я смог использовать Notepad ++ для преобразования из ISO-8859-1 в UTF-8 . Нажмите "Encoding"и затем "Convert to UTF-8".

14
27.10.2016 10:20:42

Как описано в разделе Как исправить кодировку символов в файле? Synalyze It! позволяет легко конвертировать в OS X все кодировки, поддерживаемые библиотекой ICU .

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

-1
23.05.2017 11:47:17

Попробуйте VIM

Если у вас есть, vimвы можете использовать это:

Не проверено для каждой кодировки.

Самое интересное в этом то, что вам не нужно знать кодировку источника

vim +"set nobomb | set fenc=utf8 | x" filename.txt

Помните, что эта команда изменяет непосредственно файл


Пояснительная часть!

  1. +: Используется vim для непосредственного ввода команды при открытии файла. Обычно используется для открытия файла в определенной строке:vim +14 file.txt
  2. |: Разделитель нескольких команд (как ;в bash)
  3. set nobomb : нет utf-8 спецификация
  4. set fenc=utf8: Установить новую кодировку для ссылки на документацию utf-8
  5. x : Сохранить и закрыть файл
  6. filename.txt : путь к файлу
  7. ": цитаты здесь из-за труб. (иначе bash будет использовать их как трубу bash)
89
27.10.2016 10:20:24
Довольно круто, но несколько медленно. Есть ли способ изменить это, чтобы конвертировать несколько файлов одновременно (экономя таким образом затраты на инициализацию vim)?
DomQ 25.04.2016 08:20:33
Спасибо за объяснение! У меня были трудности с началом файла, пока я не прочитал о настройке бомба / нобомб.
jjwdesign 3.10.2016 13:34:07
НП, кроме того, вы можете просмотреть бомбу, если вы используете vim -bилиhead file.txt|cat -e
Boop 3.10.2016 13:38:13
например:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel 6.04.2017 08:48:53
Я использовал это для преобразования кодировки файлов CSV и был очень взволнован, когда увидел, что кодировка действительно изменилась. К сожалению, когда я пошел загружать файл в MySQL, у него было другое количество столбцов, чем было до запуска команды vim. Хотите знать, можно ли будет просто открыть файл, преобразовать кодировку и сохранить / закрыть файл, оставив все остальное содержимое файла одинаковым?
NightOwlPrgmr 28.04.2017 15:00:17

Oneliner использует find с автоматическим определением набора символов

Кодировка символов всех соответствующих текстовых файлов определяется автоматически, и все соответствующие текстовые файлы преобразуются в utf-8кодировку:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

Для выполнения этих шагов, к югу от оболочки shиспользуются с -exec, работает один вкладыш с -cфлагом, и передавая имя файла в качестве позиционного аргумента "$1"с -- {}. Между ними utf-8выходной файл временно назван converted.

Посредством чего file -biозначает:

  • -b, --brief Не добавляйте имена файлов в выходные строки (краткий режим).

  • -i, --mime Заставляет команду file выводить строки типа mime, а не более традиционные для человека. Таким образом, это может сказать, например, text/plain; charset=us-asciiа не ASCII text. Команда sedобрезает это только так, us-asciiкак того требует iconv.

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

13
22.06.2019 18:07:12
Мне пришлось немного адаптировать это решение для работы на Mac OS X, по крайней мере, на моей версии. find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller 20.01.2017 20:07:45
Ваш код работал на Windows 7 с MinGW-w64 (последняя версия) тоже. Спасибо, что поделились этим!
silvioprog 6.01.2018 19:05:16
@rmuller Эта sedкоманда специально предназначена для автоматического определения кодировки символов. Я расширил ответ, чтобы объяснить это сейчас. В отношении читателей было бы вежливо удалить все оставшиеся не относящиеся к делу комментарии. Спасибо.
Serge Stroobandt 22.06.2019 18:16:04
@SergeStroobandt Возможно я не был достаточно ясен. Я хочу сказать, что когда вы используете «file -b --mime-encoding» вместо «file -bi», нет необходимости фильтровать результат с помощью sed. Эта команда уже возвращает только кодировку файла. Так в вашем примере "us-ascii"
rmuller 23.06.2019 15:31:45
Похоже, это ничего не делает для меня в Linux. Я сохранил файл как UTF-8 с спецификацией и ожидал, что он будет конвертирован в UTF-8 без спецификации, но этого не произошло.
Aaron Franke 19.03.2020 20:50:21

чтобы написать файл свойств (Java) обычно я использую это в Linux (дистрибутивы Mint и Ubuntu):

$ native2ascii filename.properties

Например:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS: я написал исполнение номер один / два на португальском языке, чтобы заставить специальные символы.

В моем случае при первом исполнении я получил это сообщение:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

Когда я установил первый вариант (gcj-5-jdk), проблема была закончена.

Я надеюсь, что это поможет кому-то.

1
28.11.2016 19:32:40

DOS / Windows: используйте кодовую страницу

chcp 65001>NUL
type ascii.txt > unicode.txt

Команда chcpможет быть использована для изменения кодовой страницы. Кодовая страница 65001 является именем Microsoft для UTF-8. После установки кодовой страницы выходные данные, генерируемые следующими командами, будут иметь установленную кодовую страницу.

2
8.03.2018 15:45:45

С рубином:

ruby -e "File.write('output.txt', File.read('input.txt').encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: ''))"

Источник: https://robots.thoughtbot.com/fight-back-utf-8-invalid-byte-sequence

0
26.06.2018 06:25:16

Используйте этот скрипт Python: https://github.com/goerz/convert_encoding.py Работает на любой платформе. Требуется Python 2.7.

0
1.07.2018 10:17:32

Мой любимый инструмент для этого - Jedit (текстовый редактор на основе Java), который имеет две очень удобные функции:

  • Тот, который позволяет пользователю перезагрузить текст с другой кодировкой (и, таким образом, визуально контролировать результат)
  • Еще один, который позволяет пользователю явно выбирать кодировку (и конец строки) перед сохранением
0
17.09.2018 11:08:00

Просто измените кодировку загруженного файла в IDE IntelliJ, справа от строки состояния (внизу), где указана текущая кодировка. Он предлагает перезагрузить или конвертировать, используйте конвертировать. Убедитесь, что вы сделали резервную копию оригинального файла заранее.

0
9.10.2018 16:45:06

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

И это с открытым исходным кодом , так что Yay для них

0
30.11.2019 18:49:39