- Вопрос или проблема
- Однострочное решение с использованием find, с автоматическим определением
- Ответ или решение
- П批式 конвертация кодировок файлов: Гид по методам и инструментам
- Общая информация о кодировках
- Инструменты для конвертации
- 1. Использование iconv
- 2. PowerShell для Windows
- 3. Утилита UTFCast
- 4. Программа CP Converter
- Дополнительные методы конвертации
- 5. Python скрипты
- 6. Использование Notepad++
- Заключение
Вопрос или проблема
Как я могу массово конвертировать файлы в каталоге для их кодировки (например, 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
Или в форме поиска и завоевания:
## это перезапишет оригинальные файлы!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;
Кроме того:
## это перезапишет оригинальные файлы!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;
Этот вопрос задавался много раз на этом сайте, поэтому вот дополнительная информация об “ANSI”. В ответе на связанный вопрос CesarB упоминает:
Существуют несколько кодировок, которые называются “ANSI” в Windows. На самом деле, ANSI – это неправильное название. iconv не может угадать, какую вы хотите.
Кодировка ANSI – это кодировка, используемая функциями “A” в API Windows (функции “W” используют UTF-16). Какой кодировке она соответствует, обычно зависит от языка вашей системы Windows. Самая распространенная – CP 1252 (также известная как Windows-1252). Таким образом, когда ваш редактор говорит ANSI, он имеет в виду “то, что функции API используют в качестве стандартной кодировки ANSI”, которая является стандартной некодируемой кодировкой, используемой в вашей системе (и, следовательно, обычно используемой для текстовых файлов).
Страница, на которую он ссылается, дает этот исторический факт (цитата из PDF Microsoft) о происхождении 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 является чем-то вроде unicode, ascii, utf8 и utf32. Проверьте ‘help out-file’.
Чтобы конвертировать все *.txt файлы в каталоге в UTF-8, сделайте что-то вроде этого:
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
}
Однострочное решение с использованием 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' -- {} \;
Используйте этот Python-скрипт: https://github.com/goerz/convert_encoding.py Он работает на любой платформе. Требуется Python 2.7.
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
—————Решение 1—————————–
В ответе @akira есть два недостатка.
- Ваш оригинальный файл будет обнулен, если возникнет ошибка.
- Если ваш путь содержит какой-либо не ASCII символ, это вызовет эту ошибку
Set-Content : Объект по указанному пути ...txt не существует или был отфильтрован параметром -Include или -Exclude.
Это улучшенная версия, добавляя -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, и относительно безопаснее, вы можете просмотреть, что вы собираетесь конвертировать.
- Используйте
Everything
для поиска файла, который вы хотите конвертировать. Ссылка на загрузку ниже
https://www.voidtools.com/ - Notepad++
Menu -> Plugins -> Python Script -> New Scripts
- Скопируйте один из двух скриптов (см. ниже) и измените в соответствии с вашими нуждами, сохраните его в стандартное место.
- Перетащите все файлы из
Everything
в Notepad++ - Запустите python-скрипт с помощью python-плагина в Notepad++ из
Menu -> Plugins -> Python Script -> Scripts
- Готово
Существует два скрипта, нижний может конвертировать и сохранять открытые вкладки в UTF-8
-
Скрипт 1
https://gist.github.com/bjverde/88bbc418e79f016a57539c2d5043c445 -
Скрипт 2
for filename, bufferID, index, view in notepad.getFiles():
console.write( filename + "\r\n")
notepad.activateIndex(view, index)
# UTF8 (без BOM)
notepad.menuCommand(MENUCOMMAND.FORMAT_CONV2_AS_UTF_8)
notepad.save()
notepad.reloadCurrentDocument()
ConvertZ – это еще один инструмент GUI для Windows для пакетной конверсии
- Конвертируйте файл (простой текст) или содержимое буфера обмена между следующими кодировками: big5, gbk, hz, shift-jis, jis, euc-jp, unicode big-endian, unicode little-endian и utf-8.
- Пакетная конверсия файлов
- Предпросмотр содержимого файла и преобразованного результата перед фактической конверсией.
- Автообновление charset в
<Meta>
теге, если указано в html документах.- Автоисправление неправильно сопоставленных символов Big5/GBK после конверсии.
- Изменение кодировки имени файла между big5, gbk, shift-jis и unicode.
- Конвертировать MP3 ID3 или APE между big5, gbk, shift-jis, unicode и utf-8 кодировками.
- Конвертировать теги Ogg между традиционным и упрощенным китайским в utf-8.
Альтернативная ссылка для скачивания: https://www.softking.com.tw/download/1763/
Существует dos2unix
на Unix. Был другой подобный инструмент для Windows (дополнительная ссылка здесь).
Как конвертировать между текстовыми файлами Unix и Windows? имеет еще несколько хитростей.
https://www.nikse.dk/subtitleedit Subtitle Edit отлично справляется с пакетной конверсией, с автопределением разных кодовых страниц в utf8
Я создал онлайн-инструмент для этого:
https://encoding-converter.netlify.app
Вы можете загрузить множество файлов одновременно для конвертации.
Используйте его в следующем порядке:
- введите кодировки
- выберите/перетащите ваши файлы
Загрузка начнется автоматически.
Ответ или решение
П批式 конвертация кодировок файлов: Гид по методам и инструментам
Конвертация кодировок файлов может быть необходима по различным причинам, включая совместимость с приложениями или необходимость в использовании универсальных форматов, таких как UTF-8. В этом руководстве мы рассмотрим различные методы и инструменты для批式 конвертации кодировок файлов из одной в другую, включая ANSI в UTF-8.
Общая информация о кодировках
При работе с текстовыми файлами стоит понимать, что кодировки могут слегка различаться в зависимости от используемой операционной системы. Например, Windows часто использует кодировку Windows-1252, которая, как правило, ассоциируется с термином "ANSI". Однако "ANSI" может означать разные кодировки в зависимости от настроек системы. Поэтому при конвертации важно указывать правильную кодировку исходных файлов.
Инструменты для конвертации
Существует множество утилит и программ, которые могут помочь в批式 конвертации файлов. Рассмотрим некоторые из наиболее популярных:
1. Использование iconv
Инструмент iconv
— это мощная утилита для конвертации текстовых файлов между разными кодировками. В Unix/Linux и средах Cygwin можно использовать следующую команду для конвертации файлов в текущем каталоге:
find . -name '*.txt' -exec iconv -f windows-1252 -t utf-8 -o {} {} \;
Эта команда заменяет оригинальные файлы. Убедитесь, что у вас есть резервные копии перед выполнением.
2. PowerShell для Windows
PowerShell предлагает удобные команды для обработки текстовых файлов. Например:
foreach ($file in Get-ChildItem -Path "C:\YourPath\*.txt") {
Get-Content $file.FullName | Out-File -Encoding utf8 -FilePath "C:\YourOutputPath\$($file.Name)"
}
Этот скрипт создаёт новую версию каждого текстового файла в указанной директории, сохранив оригиналы.
3. Утилита UTFCast
UTFCast является коммерческим решением для конвертации файлов, которое поддерживает批式 конвертацию и предлагает интуитивно понятный интерфейс. Оно позволяет конвертировать несколько файлов одновременно в формат UTF с сохранением структуры директорий.
4. Программа CP Converter
CP Converter — это бесплатный и открытый инструмент, который позволяет легко производить批式 конверсию файлов. Вам будет достаточно указать директорию с файлами и целевую кодировку.
Дополнительные методы конвертации
5. Python скрипты
Если вам удобен Python, вы можете использовать сторонние скрипты, такие как convert_encoding.py, которые поддерживают различные кодировки и платформы. Вот пример того, как можно написанный вами скрипт:
import os
import codecs
source_encoding = 'windows-1252'
target_encoding = 'utf-8'
directory = 'D:/YourPath/'
for filename in os.listdir(directory):
if filename.endswith('.txt'):
with codecs.open(os.path.join(directory, filename), 'r', source_encoding) as source_file:
content = source_file.read()
with codecs.open(os.path.join(directory, 'converted_' + filename), 'w', target_encoding) as target_file:
target_file.write(content)
6. Использование Notepad++
Notepad++ также предлагает плагины, которые позволяют批式 конвертацию файлов. Плагин для Python может выполнять необходимые действия, что также достаточно удобно для пользователей Windows.
Заключение
Конвертация кодировок файлов — это важная задача, которая может быть выполнена различными способами, в зависимости от используемой операционной системы и требований к проекту. Убедитесь в правильном выборе кодировок на каждом этапе, чтобы избежать потери данных или ошибок в текстах. Описанные выше методы и инструменты помогут вам эффективно справиться с этой задачей.