Пакетное преобразование файлов для кодирования

54438
desolat

Как я могу конвертировать файлы в каталоге для их кодирования (например, ANSI-> UTF-8) с помощью команды или инструмента?

Для отдельных файлов редактор помогает, но как сделать работу с массовыми файлами?

45
связанные: http://stackoverflow.com/questions/724083/unix-newlines-to-windows-newlines-on-windows nagul 15 лет назад 1
http://stackoverflow.com/a/24713621/242933 ma11hew28 10 лет назад 0

10 ответов на вопрос

34
quack quixote

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» в Windows API (функции «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 байт, если они превышают этот размер. Когда он пишет в файле, из которого пытается прочитать, ему удается выполнить работу, если файл достаточно мал, иначе он обрезает файл без предупреждения ... Niavlys 10 лет назад 3
К вашему сведению Этот вопрос помечен osx, и похоже, что ни одна из команд convert-all не работает на Yosemite или El Cap. Версия iconv Apples не поддерживает --verbose или -o, а другой тип перенаправления синтаксиса stdout по какой-то причине не работает, а просто отправляет его на обычный stdout. Scott McIntyre 8 лет назад 1
27
akira

с PowerShell вы можете сделать что-то вроде этого:

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

в то время как ENC - это что-то вроде юникода, 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.

РЕДАКТИРОВАТЬ: Для замены файлов во всех подкаталогах используйте:

% 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 9 лет назад 0
@Acroneos: тогда вы допустили ошибку: файл IN.txt, файл OUT.txt ... таким образом невозможно перезаписать оригинал. если вы использовали одно и то же имя файла для IN.txt и OUT.txt, то, очевидно, вы перезаписываете файл, из которого читаете. akira 9 лет назад 0
Powershell преобразует в UTF с спецификацией. найти и iconv может быть намного проще. pparas 7 лет назад 0
6
nagul

На странице Википедии на новых строках есть раздел, посвященный конверсионным утилитам .

Похоже, это лучший выбор для конверсии, использующей только те инструменты, которые поставляются с Windows:

TYPE unix_file | FIND "" /V > dos_file 
3
Tiler

UTFCast - это конвертер Unicode для Windows, который поддерживает пакетный режим. Я пользуюсь платной версией и мне вполне комфортно с ней.

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

Кажется, они не могут конвертироваться в одну и ту же папку, только в другую папку назначения. Uwe Keim 8 лет назад 0
1
user1055927

You can use EncodingMaster. It's free, it has a Windows, Linux and Mac OS X version and works really good.

Сайт, который вы упоминаете, закрыт. Etienne Delavennat 6 лет назад 0
1
Aneesh Garg

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

run the above command in for loop.

1
Serge Stroobandt

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.

Команда findочень полезна для такой автоматизации управления файлами.

Нажмите здесь для получения дополнительного findизобилия .

0
nik

Есть dos2unixна Unix.
Был еще один аналогичный инструмент для Windows ( еще одна ссылка здесь ).

Как я могу конвертировать между Unix и Windows текстовыми файлами? есть еще несколько хитростей

`dos2unix` полезен [для преобразования разрывов строк] (http://en.wikipedia.org/wiki/Dos2unix), но OP ищет преобразование кодировок символов. Sony Santos 10 лет назад 2
0
kinORnirvana

Используйте этот скрипт Python: https://github.com/goerz/convert_encoding.py. Он работает на любой платформе. Требуется Python 2.7.

0
Bedla

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

У меня были лучшие результаты с Enca .

Конвертировать все файлы с расширением TXT в UTF-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \; 

Похожие вопросы