2013-12-23 7 views
0

После супер-поиска метода преобразования файла кодировки в perl, Я всегда спрашиваю себя, как лучше всего это сделать.конвертировать формат кодирования

Моя проблема очень проста: У меня есть много файлов в разных кодировках (UTF-8, ISO-8859-1, windows-1252 ...), и я хочу преобразовать все эти файлы в ISO-8859- 1.

+0

Знаете ли вы, что кодировка каждого файла? – ikegami

ответ

5

Text::Iconv очень эффективен и очень быстр в преобразовании от и до большинства кодировок. Это также очень прост в использовании

use Text::Iconv; 
$converter = Text::Iconv->new("fromcode", "tocode"); 
$converted = $converter->convert("Text to convert"); 

простой пример,

use Text::Iconv; 
my $converter = Text::Iconv->new("utf8", "iso-8859-1"); 
my $iso_8859_1_string = $converter->convert($some_utf8_string); 

Если вы не знаете кодировку файла, который вы пытаетесь конвертировать, вы можете использовать Encode::Detect::Detector автоматически найти кодировку.

use Encode::Detect::Detector; 
my $charset = detect($string); 
0

ПРЕДУПРЕЖДЕНИЕ: Вы положили Perl как тег, и это не является решением Perl. Тем не менее, это не объясняет, как вы можете быстро конвертировать файлы из одного формата кодирования в другой, и, возможно, даже поможет вам выяснить, какие кодировки ваши файлы в.


Команда iconv может легко конвертировать файлы из одной кодировки в другой. Давайте предположим, что файл в формате UTF-8, и вы хотите, чтобы преобразовывать его ISO-8859-1 формате:

$ iconv -f utf8 -t latin1 $utf8_file > $latin1_file 

Вы можете найти список различных кодировок файлов, которые iconv может конвертировать из или путем использования -l параметр. iconv имеет множество псевдонимов для различных форматов, так что вы наверняка получите все правильно, независимо от того, что вы можете набрать. Например, для ISO-8859-1, различные псевдонимы, перечисленные являются:

CP819 IBM819 ISO-8859-1 ISO-IR-100 ISO8859-1 ISO_8859-1 ISO_8859-1:1987 L1 LATIN1 CSISOLATIN1 

Конечно, это не говорит вам, что оригинальное кодирование файла на самом деле. Здесь file может вам помочь.

У меня есть UTF-8 кодируются тестовый файл с именем text_utf.txt:

File encoding test: 

â Õ ¼ ¥ 

Теперь я сделаю еще одну копию файла в кодировке ISO-8859-1 формате:

$ iconv -f utf8 -t latin1 text_utf.txt > text_latin1.txt 

Если я дам обоих этих файлов в команде file, он расскажет мне свою кодировку:

$ file test_*.txt 
test_latin1.txt: ISO-8859 text 
test_utf8.txt: UTF-8 Unicode text 

Обратите внимание, что команда file может выводить тип кодировки, и этого может быть достаточно для использования с командой iconv.

Несколько предостережений: не все кодирующие преобразования будут работать.Это особенно верно, если файл закодирован в utf-8 формате, который может представлять миллионы уникальных персонажей, и вы пытаетесь преобразовать его в формат, как ISO-8859-1, который может представлять только в 255 символов:

$ iconv -f utf8 -t mac test_utf8.txt > test_macroman.text # The ¼ isn't a MacRoman character 
iconv: test_utf8.txt:3:4: cannot convert 

Кроме того, file команда только смотрит на первые несколько блоков файла, поэтому, если символы, которые указывают, закодированный файл похоронен глубоко внутри файла, команда file может не увидеть их. И также возможно, что команда file путает два разных кодировки. file может легко определить, есть ли файл в формате utf-8 или нет, но он может не знать, находится ли файл в одном формате кодировки в 255 байт или другой.


Это все красиво и хорошо, но я на системе Windows, вы идиот.

Я подозревал, как много, так как вы хотите конвертировать файлы из более универсален, Linux/Mac дружественный UTF-8 кодировку ISO-8859-1, который похож на Windows, кодовой страницы 1252 - стандарт кодирования файлов для Windows для Соединенных Штатов.

Все еще, вы можете найти комбинацию команд file и iconv, чтобы быть хорошим способом определить кодировки файлов и скрывать их от одной кодировки к другой.

Если вы находитесь в системе Windows, вы можете скачать Cygwin, который предоставит вам все стандартные утилиты GNU, найденные в системах Linux (включая полную оболочку BASH). Я нашел Cygwin полезным, когда я нахожусь в системе Windows, и вам нужно сделать что-то, что не может легко выполнить стандартный скрипт Windows BATCH - например, преобразование огромного количества файлов из одного формата в другой.

Смежные вопросы