Perl один лайнер для преобразования из shiftjis в utf8

Я пытаюсь следующий лайнер, чтобы преобразовать файл из кодировки shiftjis в utf-8, и он не работает. Любые полезные умные люди доступны?

perl -i.bak -e 'use utf8; use Encode qw(decode encode);  my $ustr = Encode::decode("shiftjis",$_); my $val = Encode::encode("utf-8",$ustr);  print "$val";' filename 

Я довольно новичок в кодовых страницах, и в Интернете, похоже, полно всевозможных сложностей по этому вопросу. Я просто хочу один лайнер. Входной файл и выходной файл выглядят одинаково.

2 ответа

Решение

Вы забыли -n переключатель, который будет перебирать каждую строку ввода, загружая по одной строке за раз $_ и выполнение кода, предоставленного в -e аргумент.

Более кратко, вы могли бы написать свою программу как

perl -MEncode -pi.bak -e '$_=encode("utf-8",decode("shiftjis",$_))' filename

Perl - странный выбор для этого, учитывая, что для этого уже есть стандартная утилита:

iconv -f shift-jis -t utf-8 filename

Конечно, это не позволяет легко редактировать файл на месте, но есть и recode который также установлен в моей системе как-то:)...

recode shift-jis..utf-8 filename

Или используйте moreutils:

iconv -f shift-jis -t utf-8 filename | sponge filename

Хм. Похоже, TMTOWTDI.

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