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


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.