Perl,unicode和locales:如何使用`perl -p -i -e'处理非utf8语言环境中的字符串?

时间:2010-12-04 11:10:41

标签: perl string unicode utf-8 locale

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 个答案:

答案 0 :(得分:3)

您忘记表示替换文本的编码。 更新:在第一个版本中,我有一个涉及讨厌的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
ййййййй ййййй