Найкращий спосіб конвертувати текстові файли між наборами символів?


526

Який найшвидший, найпростіший інструмент або спосіб перетворення текстових файлів між наборами символів?

Зокрема, мені потрібно перетворити з UTF-8 на ISO-8859-15 і навпаки.

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

Найкращі рішення поки що:

У Linux / UNIX / OS X / cygwin:

  • Gnu iconv, запропонований Троелями, Арвін найкраще використовувати як фільтр . Це, здається, є загальнодоступним. Приклад:

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

    Як зазначив Бен , існує онлайн-конвертер, що використовує iconv .

  • Gnu recode ( посібник ), запропонований 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, у закодований Base64 файл латинської 1 із закінченнями рядка Dos:

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

У Windows з Powershell ( Jay Bazuzi ):

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

    (Немає підтримки ISO-8859-15; він говорить про те, що підтримувані діаграми є unicode, utf7, utf8, utf32, ascii, bigendianunicode, за замовчуванням та oem.)

Редагувати

Ви маєте на увазі підтримку iso-8859-1? Використання "String" робить це, наприклад, навпаки

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

Примітка. Можливі значення перерахування - "Невідомо, Рядок, Unicode, Байт, BigEndianUnicode, UTF8, UTF7, Ascii".

  • CsCvt - Kalytta's Character Converter - це ще один чудовий інструмент перетворення на основі командного рядка.

Я спробував, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlале він перетворює файл у utf-8, але тоді він порожній! Блокнот ++ каже, що файл у форматі Ansi, але читання, наскільки я розумію, це навіть не дійсна діаграма ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
— OZZIE

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
Для всіх, хто потрапляє на недоступні неширокі версії, схоже, що версії OSX (і, можливо, всі BSD) версії iconv не підтримують псевдоніми без тире для різних кодувань 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.
— кнб

Мені це подобається, тому що це стандарт на більшості NIX-платформ. Але також дивіться опцію командного VIM (псевдонім: ex) нижче . Додаткова інформація: (1) вам (напевно) не потрібно вказувати параметр -f(від) iconv. (2) file --mime-encoding <file/s>команда може допомогти вам з'ясувати кодування в першу чергу.
— fr13d

1
fileКоманда FWIW повідомила моє джерело як 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 BOM
  4. set fenc=utf8: Встановіть нове кодування на utf-8 doc-посилання
  5. x : Збереження та закриття файлу
  6. filename.txt : шлях до файлу
  7. ": цитати тут через труби. (інакше bash використовуватиме їх як bash pipe)

Досить круто, але трохи повільно. Чи є спосіб змінити це, щоб перетворити відразу декілька файлів (таким чином заощаджуючи на витратах на ініціалізацію vim)?
— DomQ

Дякую за пояснення! Мені було важко з початком файлу, поки я не прочитав про налаштування бомби / нобомби.
— jjwdesign

1
np, крім того, ви можете переглянути бомбу, якщо використовуєте 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

Найкоротша версія, якщо ви можете припустити, що вхідний BOM правильний:

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 (fe SQL-сервера bcp) наполягають на UTF16 - і тоді їх утиліта не перетворить на нього. Цікаво сказати щонайменше.
— Ной

Я спробував, gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlале він перетворює файл у utf-8, але тоді він порожній! Блокнот ++ каже, що файл у форматі Ansi, але читання, наскільки я розумію, це навіть не дійсна діаграма ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
— OZZIE

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 є зайвим.
— LMZ

1
Ви можете виконати цю функцію за допомогою автоматичного визначення формату введення?
— mlibre

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 Викликає команду файлу виводити рядки типу 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-кодування" замість "file -bi", немає потреби в фільтрації результату за допомогою sed. Ця команда вже повертає лише кодування файлу. Так у вашому прикладі "us-ascii"
— rmuller

Насправді це насправді нічого не робить для мене в Linux. Я зберег файл у форматі UTF-8 разом із BOM і очікував, що він перетвориться на UTF-8 без BOM, і він не став.
— Аарон Франке

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 (дистрибутиви на монетній основі та 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

Якщо програми GUI для macOS - це ваш хліб і масло, SubEthaEdit є текстовим редактором, до якого я зазвичай заходжу для кодування-хитання - його "перегляд конверсій" дозволяє вам бачити всі недійсні символи у вихідному кодуванні та виправляти / видаляти їх.

І зараз це відкритий код , так що для них 😉.


-1

Як описано в розділі Як виправити кодування символів файлу? Синалізуйте це! дозволяє легко конвертувати на OS X між усіма кодуваннями, що підтримуються бібліотекою ICU .

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.