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.