Как я могу преобразовать кучу файлов из ISO-8859-1 в UTF-8 с помощью Perl?

У меня есть несколько документов, которые мне нужно преобразовать из ISO-8859-1 в UTF-8 (конечно, без спецификации). Это проблема, хотя. У меня так много этих документов (на самом деле это смесь документов, некоторые UTF-8 и некоторые ISO-8859-1), что мне нужен автоматизированный способ их преобразования. К сожалению, у меня установлен только ActivePerl, и я мало что знаю о кодировании на этом языке. Я могу установить PHP, но я не уверен, так как это не мой персональный компьютер.

Просто чтобы вы знали, я использую Scite или Notepad++, но оба конвертируются неправильно. Например, если я открываю документ на чешском языке, содержащий символ «ž», и перехожу к параметру «Преобразовать в UTF-8» в Notepad++, он неправильно преобразует его в нечитаемый символ.

Есть способ, которым я МОГУ преобразовать их, но это утомительно. Если я открою документ со специальными символами и скопирую документ в буфер обмена Windows, затем вставлю его в документ UTF-8 и сохраню, все в порядке. Это слишком утомительно (открывать каждый файл и копировать/вставлять в новый документ) для того количества документов, которое у меня есть.

Любые идеи? Спасибо!!!


person tau    schedule 17.04.2010    source источник
comment
ž не является символом ISO-8859-1, но он есть в Windows-1252. Возможно, вы работаете в 8-битной кодировке, специфичной для локали. Требуется больше деталей.   -  person Kaleb Pederson    schedule 17.04.2010
comment
Я действительно думаю, что документ закодирован в ANSI. Я по ошибке написал, какая кодировка была установлена ​​​​в метатеге.   -  person tau    schedule 17.04.2010


Ответы (3)


Если включен символ «ž», то кодировка определенно не ISO-8859-1 («Latin 1»), а, вероятно, CP1252 («Win Latin 1»). Работа со смесью UTF8, ISO-8859-1 и CP1252 (возможно, даже в одном файле) — это именно то, что Encoding::FixLatin Модуль Perl предназначен для.

Вы можете установить модуль из CPAN, выполнив эту команду:

perl -MCPAN -e "install 'Encoding::FixLatin'"

Затем вы можете написать короткий сценарий Perl, использующий модуль Encoding::FixLatin, но есть еще более простой способ. Модуль поставляется с командой fix_latin, которая принимает смешанную кодировку на стандартный ввод и записывает UTF8 на стандартный вывод. Таким образом, вы можете использовать такую ​​командную строку для преобразования одного файла:

fix_latin <input-file.txt >output-file.txt

Если вы используете Windows, то команда fix_latin может отсутствовать на вашем пути и, возможно, не запускалась через pl2bat, и в этом случае вам нужно будет сделать что-то вроде:

perl C:\perl\bin\fix_latin.pl <input-file.txt >output-file.txt

Точные пути и имена файлов должны быть скорректированы для вашей системы.

Запустить fix_latin для целой группы файлов было бы тривиально в системе Linux, но в Windows вам, вероятно, потребуется использовать powershell или что-то подобное.

person Grant McLean    schedule 18.04.2010
comment
спасибо большое грант! ваш скрипт очень хорошо работал с командой fix_latin. Я не могу найти способ запустить его через несколько файлов. - person tau; 19.04.2010

Я не уверен, что это правильный ответ на ваш конкретный вопрос, но смотрели ли вы на инструмент GNU iconv? Это довольно общедоступно.

person AKX    schedule 17.04.2010

Если у вас есть доступ к cygwin или вы можете загрузить несколько распространенных инструментов *nix (вам понадобятся bash, grep, iconv и файл, все они доступны для Windows через, скажем, gnuwin32), вы можете написать довольно простой сценарий оболочки, который выполняет эту работу.

Сценарий будет приблизительно выглядеть следующим образом:

for f in *;
do
   if file $f | grep 'ISO-8859' > /dev/null;
   then
      cat $f | iconv -f iso-8859-1 -t utf-8 > $f.converted;
   else
      echo "Not converting $f"
   fi;
done;

Однако вам нужно будет проверить шаги, например. Я не уверен, что именно «файл» сказал бы для документа ISO-8859.

person KT.    schedule 17.04.2010