2010-12-04 58 views
2
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''' 

me donne un tas d'erreurs:Perl, unicode et locales: comment traiter une chaîne dans un environnement local non-utf8 en utilisant `perl -p -i -e '?

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

Que faut-il faire pour ne pas obtenir cette erreur (notez que locale peut être tout).

Répondre

3

Vous avez oublié de mentionner l'encodage du texte de substitution. Mise à jour: Dans la première révision, j'ai eu une solution impliquant le encoding pragma. Il peut être complètement évité, mais la manière standard comme ci-dessous ne me vient pas à l'esprit pour le moment pour une raison quelconque.

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 
ййййййй ййййй 
+0

C'est utf8. Ajouter 'utf8' ne sert à rien ici et, bien sûr, je ne peux pas utiliser' use encoding' parce que ** locale peut être n'importe quel **. – ZyX

+2

ZyX, ma modification et votre commentaire se chevauchent. Vous devriez trouver ma réponse révisée qui vous rend heureux et content. – daxim

+0

Merci, j'ai essayé d'ajouter 'use utf8' dans le bloc' BEGIN', mais il a échoué. – ZyX