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

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

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

15 ответов

Решение

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" в 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. ,

С 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
}

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 в изобилии.

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

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

TYPE unix_file | FIND "" /V > dos_file

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

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

Существует бесплатный конвертер пакетного кодирования с открытым исходным кодом под названием CP Converter.

В моем случае мне понадобилось автоматическое обнаружение кодировки ввода, и там было много файлов с 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' -- {} \;

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

выполните указанную выше команду в цикле for.

Наконец-то я сделал для этого инструмент: https://github.com/gonejack/transcode

Установить:

go get -u github.com/gonejack/transcode

Применение:

> transcode source.txt
> transcode -s gbk -t utf8 source.txt

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

---------------Решение 1 -----------------------------
Есть два недостатка. в ответе @akira.

  1. Ваш исходный файл будет обнулен, если произойдет какой-либо сбой.
  2. Если ваш путь содержит какой-либо символ, отличный от ASCII, будет выдана эта ошибка.Set-Content : An object at the specified path ...txt does not exist, or has been filtered by the -Include or -Exclude parameter.

Это улучшенная версия, в которую добавлено-LiteralPathиif($?)

      foreach($i in ls -name *.txt) {
    $relativePath = Resolve-Path -Relative -LiteralPath "$i"
    $temp = Get-Content -LiteralPath "$relativePath" 
    if($?)
    {
        Out-File -LiteralPath "$i" -inputobject "$temp" -encoding utf8 -force
    }
}

----------------Решение 2 (лучшее)----------------
PowerShell может скрывать очень ограниченные кодировки, такие как gb2312, Shift-JIS. не являются одними из них. В Notepad++ есть плагин Python, который работает лучше, чем PowerShell, и относительно безопаснее: вы можете просмотреть то, что собираетесь конвертировать.

  1. Используйте поиск файла, который вы хотите конвертировать. Ссылка для скачивания находится ниже
    https://www.voidtools.com/.
  2. Блокнот++Menu -> Plugins -> Python Script -> New Scripts
  3. Скопируйте один из двух скриптов (см. ниже), измените его по своему усмотрению и сохраните в папке по умолчанию.
  4. Перетащите все файлы изEverythingв блокнот++
  5. Запустите скрипт Python с плагином Python в блокноте ++ изMenu -> Plugins -> Python Script -> Scripts
  6. Сделанный

Есть два скрипта, нижний может конвертировать и сохранять открытые вкладки в UTF-8.

      for filename, bufferID, index, view in notepad.getFiles():
    console.write( filename + "\r\n")        
    notepad.activateIndex(view, index)       
    # UTF8 (without BOM)
    notepad.menuCommand(MENUCOMMAND.FORMAT_CONV2_AS_UTF_8)
    notepad.save()    
    notepad.reloadCurrentDocument()

ConvertZ — еще один инструмент Windows с графическим интерфейсом для пакетного преобразования.

  • Конвертируйте содержимое файла (обычный текст) или буфера обмена в следующие кодировки: big5, gbk, hz,shift-jis, jis, euc-jp, юникод с прямым порядком байтов, юникод с прямым порядком байтов и utf-8.
  • Пакетное преобразование файлов
  • Предварительный просмотр содержимого файла и результата преобразования перед фактическим преобразованием.
  • Автоматически обновить кодировку в<Meta>тег, если он указан в html-документах.
  • Автоматическое исправление неправильного сопоставления символов Big5/GBK после преобразования.
  • Измените кодировку имени файла на big5, gbk,shift-jis и unicode.
  • Конвертируйте ID3 или APE MP3 в кодировки big5, gbk,shift-jis, unicode и utf-8.
  • Преобразование тега Ogg между традиционным и упрощенным китайским языком в utf-8.

Альтернативная ссылка для скачивания: https://www.softking.com.tw/download/1763/

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

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

Вы можете использовать EncodingMaster . Он бесплатный, имеет версию для Windows, Linux и Mac OS X и работает действительно хорошо.

Для этого я создал онлайн-инструмент:

https://encoding-converter.netlify.app

Вы можете загрузить сразу несколько файлов для конвертации. Используйте его в следующем порядке:

  1. введите кодировки
  2. выберите/перетащите файлы

Загрузка начнется автоматически.

Другие вопросы по тегам