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


526

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

В частности, мне нужно конвертировать из 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».


Я пытался, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlно он конвертирует файл в UTF-8, но тогда он пуст! Notepad ++ говорит, что файл в формате Ansi, но, как я понимаю, читается, что это даже не правильный набор символов ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
ОЗЗИ

2
Просто наткнуться на это в поисках ответа на связанный вопрос - отличное резюме! Просто подумал, что стоит добавить, что он recodeбудет действовать как фильтр, если вы не передадите ему имя файла, например:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htm кажется мне мертвым? (тайм-аут)
Эндрю Ньюби

2
Если вы используете enca, вам не нужно указывать кодировку ввода. Достаточно часто просто указать язык: enca -L ru -x utf8 FILE.TXT.
Александр Позднеев

1
На самом деле, iconv работал намного лучше как конвертер на месте вместо фильтра. Преобразование файла с более чем 2 миллионами строк с использованием iconv -f UTF-32 -t UTF-8 input.csv > output.csvсохраненных только около семисот тысяч строк, только трети. С помощью версии на месте iconv -f UTF-32 -t UTF-8 file.csvуспешно преобразуются все 2 миллиона плюс строк.
Nicolay77

Ответы:


246

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

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).


4
Для всех остальных, кто запутался из-за недоступности не-даш-версий, похоже, что версии iconv для OSX (и, возможно, все BSD) не поддерживают псевдонимы без даш для различных кодировок UTF- *. iconv -l | grep UTFрасскажет вам обо всех UTF-кодировках, которые поддерживает ваша копия iconv.
coredumperror

14
Не знаете кодировку вашего входного файла? Используйте chardet in.txtдля генерации лучшего предположения. Результат может быть использован как ENCODING в iconv -f ENCODING.
Тушеное мясо

4
Предотвращение выхода на недопустимые символы (избегая illegal input sequence at positionсообщений), и заменить «странные» символы с «похожими» символы: iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
knb

Мне это нравится, потому что это стандартно для большинства платформ NIX. Но также смотрите опцию командной VIM (псевдоним: ex) ниже . Дополнительная информация: (1) вам (вероятно) не нужно указывать параметр -f(from) с помощью iconv. (2) file --mime-encoding <file/s>команда может помочь вам выяснить кодировку в первую очередь.
13

1
FWIW fileкоманда сообщила, что мой источник UTF-16 Little Endian; Бег iconv -f UTF-16 -t UTF-8...преобразовал его неправильно в ASCII, я должен был явно указать iconv -f UTF-16LE...для вывода UTF-8
Платон

90

Попробуйте 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)

Довольно круто, но несколько медленно. Есть ли способ изменить это, чтобы конвертировать несколько файлов одновременно (экономя таким образом затраты на инициализацию vim)?
DomQ

Спасибо за объяснение! У меня были трудные времена с началом файла, пока я не прочитал о настройке бомба / нобомб.
jjwdesign

1
НП, кроме того, вы можете просмотреть бомбу, если вы используете vim -bилиhead file.txt|cat -e
Boop

1
например:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Габриэль

Я использовал это для преобразования кодировки файлов CSV и был очень взволнован, когда увидел, что кодировка действительно изменилась. К сожалению, когда я пошел загружать файл в MySQL, у него было другое количество столбцов, чем было до запуска команды vim. Хотите знать, можно ли будет просто открыть файл, преобразовать кодировку и сохранить / закрыть файл, оставив все остальное содержимое файла одинаковым?
NightOwlPrgmr

39

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


Как вы конвертируете в LF? Есть /CRи /CR-LFнет/LF
Аарон Франке


20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

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

gc FILE.TXT | Out-File -en utf7 file-utf7.txt

1
Вот более короткая версия, которая работает лучше. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Ларри

@LarryBattle: Как Set-Contentработает лучше, чем Out-File?
Джей Базузи

...ой. Я думаю, что они почти одно и то же. У меня были проблемы с запуском вашего примера, потому что я предполагал, что обе версии использовали один и тот же file-utf8.txtфайл для ввода, так как у них был один и тот же выходной файл file-utf7.txt.
Ларри

Это было бы действительно здорово, за исключением того, что он не поддерживает UTF16. Он поддерживает UTF32, но не UTF16! Мне не нужно было бы конвертировать файлы, за исключением того, что многие программы Microsoft (например, SQL Server bcp) настаивают на UTF16 - и тогда их утилита не преобразуется в него. Интересно, мягко говоря.
Ноя

Я пытался, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlно он конвертирует файл в UTF-8, но тогда он пуст! Notepad ++ говорит, что файл в формате Ansi, но, как я понимаю, читается, что это даже не правильный набор символов ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
ОЗЗИ

16

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

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

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

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

utf8 MyClass.java

8
лучше использовать tmp = $ (mktmp) для создания временного файла. Кроме того, строка с rm является избыточной.
ЛМЗ

1
Вы можете выполнить эту функцию с автоопределением формата ввода?
Млибре

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

Это изменяет содержимое текстового файла. Я запустил это на UTF-8 с BOM, ожидая получить UTF-8 без файла BOM, но он был в начале файла.
Аарон Франке

14

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

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


13

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 .


3
Мне пришлось немного адаптировать это решение для работы на 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"' -- {} \;
Брайан Дж. Миллер

1
Ваш код работал на Windows 7 с MinGW-w64 (последняя версия) тоже. Спасибо, что поделились этим!
silvioprog

@rmuller Эта sedкоманда специально предназначена для автоматического определения кодировки символов. Я расширил ответ, чтобы объяснить это сейчас. В отношении читателей было бы вежливо удалить любые оставшиеся не относящиеся к делу комментарии. Спасибо.
Серж

@SergeStroobandt Возможно я не был достаточно ясен. Я хочу сказать, что когда вы используете «file -b --mime-encoding» вместо «file -bi», нет необходимости фильтровать результат с помощью sed. Эта команда уже возвращает только кодировку файла. Так в вашем примере "us-ascii"
rmuller

Похоже, это ничего не делает для меня в Linux. Я сохранил файл как UTF-8 с спецификацией и ожидал, что он будет конвертирован в UTF-8 без спецификации, но этого не произошло.
Аарон Франке

3

PHP iconv ()

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


1
Это утверждение прекрасно работает при преобразовании строк, но не для файлов.
jjwdesign

2

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

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

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


1

чтобы написать файл свойств (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), проблема была закончена.

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




0

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

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

0

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


0

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

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


-1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.