Як я можу створювати пакетні перетворення файлів у каталозі для їх кодування (наприклад, ANSI-> UTF-8) за допомогою команди чи інструменту?
Для окремих файлів редактор допомагає, але як зробити роботу з масовими файлами?
Як я можу створювати пакетні перетворення файлів у каталозі для їх кодування (наприклад, ANSI-> UTF-8) за допомогою команди чи інструменту?
Для окремих файлів редактор допомагає, але як зробити роботу з масовими файлами?
Відповіді:
Cygwin або GnuWin32 надають Unix інструменти , такі як iconv
і dos2unix
(і unix2dos
). У розділі 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 .
iconv
Здається, скорочення файлів до 32 768 байт, якщо вони перевищують цей розмір. Коли він пише у файл, з якого він намагається прочитати, йому вдається виконати роботу, якщо файл достатньо малий, інакше він усікає файл без будь-якого попередження ...
за допомогою повноважень ви можете зробити щось подібне:
% 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
}
На сторінці Вікіпедії в нових рядках є розділ про утиліти перетворення .
Здається, найкраща ставка на конверсію, використовуючи лише інструменти, з якими Windows постачається:
TYPE unix_file | FIND "" /V > dos_file
UTFCast - це конвертер Unicode для Windows, який підтримує пакетний режим. Я використовую платну версію і мені цілком комфортно.
UTFCast - це конвертер Unicode, який дозволяє пакетно перетворювати всі текстові файли в кодування UTF лише одним клацанням миші. Ви можете використовувати його для перетворення каталогів з текстовими файлами в кодування UTF, включаючи UTF-8, UTF-16 та UTF-32, у вихідний каталог, зберігаючи структуру каталогів вихідних файлів. Навіть не важливо, чи має ваш текстовий файл інше розширення, UTFCast може автоматично виявити текстові файли та перетворити їх.
Кодування символів усіх відповідних текстових файлів виявляється автоматично, і всі відповідні текстові файли перетворюються на 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
багатства .
iconv -f original_charset -t utf-8 originalfile > newfile
запустіть вищевказану команду для циклу.
Використовуйте цей сценарій Python: https://github.com/goerz/convert_encoding.py Він працює на будь-якій платформі. Потрібен Python 2.7.
Є dos2unix
на unix.
Був ще один подібний інструмент для Windows ( ще одна посилання тут ).
Як конвертувати текстові файли Unix та Windows? має ще кілька хитрощів
dos2unix
корисно для перетворення розривів рядків , але ОП шукає перетворення кодувань символів.
Можна використовувати EncodingMaster . Це безкоштовно, має версії для Windows, Linux та Mac OS X і працює дуже добре.
У моєму випадку використання мені знадобилося автоматичне виявлення кодування на вході, і там було багато файлів з 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' -- {} \;