Perl, Unicode и локали: как обработать строку в локали не-utf8, используя `perl -p -i -e '? - PullRequest
2 голосов
/ 04 декабря 2010
setopt rcquotes
zsh -c 'export LANG="ru_RU.CP1251"; echo "Русский текст" | iconv -f utf8 | perl -p -i -e ''BEGIN{use open ":locale"}s/\p{InCyrillic}/й/g'''

дает мне кучу ошибок:

"\x{00d0}" does not map to cp1251, <> line 1.
"\x{00b9}" does not map to cp1251, <> line 1.

Что нужно сделать, чтобы не получать эти ошибки (обратите внимание, что языковой стандарт может быть любым).

1 Ответ

3 голосов
/ 05 декабря 2010

Вы забыли обозначить кодировку текста подстановки. Обновление : В первой ревизии у меня было решение, включающее неприятную encoding прагму.Этого можно полностью избежать, но стандартный способ, описанный ниже, до сих пор почему-то не приходил мне в голову.

bash> export LANG=ru_RU.koi8r   # I do not have CP…

bash> echo "Русский текст" | iconv -f UTF-8 | hex
0000  f2 d5 d3 d3 cb c9 ca 20  d4 c5 cb d3 d4 0a        �������  �����.

bash> echo "Русский текст" | iconv -f UTF-8 | perl -p -i -e'BEGIN {use open ":locale"}; use utf8; s/\p{InCyrillic}/й/g' | hex
0000  ca ca ca ca ca ca ca 20  ca ca ca ca ca 0a        �������  �����.

bash> echo "Русский текст" | iconv -f UTF-8 | perl -p -i -e'BEGIN {use open ":locale"}; use utf8; s/\p{InCyrillic}/й/g' | iconv -t UTF-8
ййййййй ййййй
...