Пакетне перетворення файлів для кодування


46

Як я можу створювати пакетні перетворення файлів у каталозі для їх кодування (наприклад, ANSI-> UTF-8) за допомогою команди чи інструменту?

Для окремих файлів редактор допомагає, але як зробити роботу з масовими файлами?



Відповіді:


36

Cygwin або GnuWin32 надають Unix інструменти , такі як iconvі dos2unixunix2dos). У розділі Unix / Linux / Cygwin ви хочете використовувати "Windows-1252" як кодування замість ANSI (див. Нижче). (Якщо ви не знаєте, що ваша система використовує кодову сторінку, відмінну від 1252, як свою кодову сторінку за замовчуванням. У цьому випадку вам потрібно буде повідомити iconv потрібну кодову сторінку для перекладу.)

Перетворити з одного ( -f) в інший ( -t) за допомогою:

$ iconv -f windows-1252 -t utf-8 infile > outfile

Або у формі пошуку-все-і-підкорити:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

Як варіант:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

Це питання задавали багато разів на цьому веб-сайті, тож ось додаткова інформація про "ANSI". У відповіді на відповідне запитання CesarB згадує :

Є кілька кодувань, які в Windows називаються "ANSI". Насправді, ANSI - це неправильне слово . iconv не може вгадати, якого ви хочете.

ANSI-кодування - це кодування, яке використовується функціями "A" в API Windows (функції "W" використовують UTF-16). Якому кодуванню воно відповідає, зазвичай залежить від вашої мови системи Windows. Найпоширенішим є CP 1252 (також відомий як Windows-1252). Отже, коли ваш редактор каже ANSI, це означає "все, що функції API використовують як кодування ANSI за замовчуванням", що є кодуванням Unicode за замовчуванням, яке використовується у вашій системі (і, як правило, тим, яке використовується для текстових файлів).

Сторінка, на яку він посилається, містить цей історичний привід (цитується з Microsoft PDF ) про джерела CP 1252 та ISO-8859-1, іншого часто використовуваного кодування:

[...] це пов'язано з тим, що сторінка коду Windows 1252 спочатку базувалася на проекті ANSI, який став стандартом ISO 8859-1. Однак, додаючи кодові точки до діапазону, відведеного для кодів управління у стандарті ISO, кодова сторінка Windows 1252 та наступні кодові сторінки Windows спочатку на основі серії ISO 8859-x відхиляються від ISO. На сьогоднішній день нечасто спільнота розробників як у Microsoft, так і поза нею плутати сторінку коду 8859-1 з Windows 1252, а також див. "ANSI" або "A", що використовується для позначення підтримки кодової сторінки Windows .


4
Не використовуйте те саме ім’я файлу, що й вхід та вихід! iconvЗдається, скорочення файлів до 32 768 байт, якщо вони перевищують цей розмір. Коли він пише у файл, з якого він намагається прочитати, йому вдається виконати роботу, якщо файл достатньо малий, інакше він усікає файл без будь-якого попередження ...
Niavlys,

1
FYI Це питання позначено тегом osx, і воно не схоже на те, що жодна з команд перетворення працює на Yosemite або El Cap. Версія iconv Apple's ship не підтримує --verbose або -o, а інший синтаксис stdout перенаправлення чомусь не працює, а просто надсилає його до регулярного stdout.
Скотт Макінтайр

28

за допомогою повноважень ви можете зробити щось подібне:

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

а ENC - це щось на зразок unicode, ascii, utf8, utf32. каси "довідковий файл".

перетворити всі * .txt файли в каталог в utf8 зробити щось подібне:

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

який створює перетворену версію кожного .txt-файлу в DIR2.

EDIT: Для заміни файлів у всіх підкаталогах використовуйте:

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}

Перетворення з ANSI на UTF за допомогою вашої першої пропозиції стирає весь вміст мого текстового файлу ...
Acroneos

@Acroneos: тоді ви допустили помилку: in-файл - IN.txt, вихідний файл - OUT.txt ... таким чином неможливо перезаписати оригінал. якщо ви використовували однакове ім’я файлу для IN.txt та OUT.txt, очевидно, ви перезаписуєте файл, з якого ви читаєте.
акіра

Powershell перетвориться на UTF з BOM. знайти і iconv може бути набагато простіше.
pparas

6

На сторінці Вікіпедії в нових рядках є розділ про утиліти перетворення .

Здається, найкраща ставка на конверсію, використовуючи лише інструменти, з якими Windows постачається:

TYPE unix_file | FIND "" /V > dos_file

3

UTFCast - це конвертер Unicode для Windows, який підтримує пакетний режим. Я використовую платну версію і мені цілком комфортно.

UTFCast - це конвертер Unicode, який дозволяє пакетно перетворювати всі текстові файли в кодування UTF лише одним клацанням миші. Ви можете використовувати його для перетворення каталогів з текстовими файлами в кодування UTF, включаючи UTF-8, UTF-16 та UTF-32, у вихідний каталог, зберігаючи структуру каталогів вихідних файлів. Навіть не важливо, чи має ваш текстовий файл інше розширення, UTFCast може автоматично виявити текстові файли та перетворити їх.


Здається, вони не можуть конвертувати в одну папку, лише в іншу папку призначення.
Uwe Keim

Професійна версія дозволяє конвертувати на місці. $ 20 / 3місяця. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

О, експресна (безкоштовна) версія марна - вона лише "виявляє" utf-8 З BOM !! (Кожен може зробити що ). Лише Pro версія, яка автоматично оновлює кожні 3 місяці за 20 доларів за поп, автоматично виявить. Ціна крута для непідприємницького користувача. І Остерігайтеся, якщо ви спробуєте базову версію, а ваш файл вже utf-8 (без BOM), цей конвертер виявить його як ASCII, а потім (повторно) "перетворить" його на utf-8, що може призвести до потворності . Будьте в курсі цього, перш ніж спробувати експрес-версію! У них є демо-версія для професіонала, який не дає результатів - безглуздий ІМХО не може перевірити результати перед покупкою!
SherylHohman

3

Oneliner з використанням знаходження, з автоматичним виявленням

Кодування символів усіх відповідних текстових файлів виявляється автоматично, і всі відповідні текстові файли перетворюються на 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.

findКоманда дуже корисна для такої автоматизації управління файлами.

Клацніть тут, щоб отримати більше findбагатства .


1

iconv -f original_charset -t utf-8 originalfile > newfile

запустіть вищевказану команду для циклу.





0

У моєму випадку використання мені знадобилося автоматичне виявлення кодування на вході, і там було багато файлів з Windows-1250кодуванням, для яких команда file -bi <FILE>повертається charset=unknown-8bit. Це недійсний параметр для iconv.

У мене були найкращі результати з енкою .

Перетворити всі файли з розширенням txt у utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.