Как я могу конвертировать кучу файлов из ISO-8859-1 в UTF-8, используя Perl? - PullRequest
1 голос
/ 17 апреля 2010

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

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

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

Есть идеи? Спасибо !!!

Ответы [ 3 ]

5 голосов
/ 18 апреля 2010

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

Вы можете установить модуль из 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 или аналогичный.

1 голос
/ 17 апреля 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.

1 голос
/ 17 апреля 2010

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

...