で正しい$1
で\1
を交換しましたPerlプログラムへの入力は内部的にUnicodeに変換されていません(まだUTF-8バイトの文字列です) は、Perlの文字列に入力を変換するオプション-CI
使用して標準入力ストリームにUTF-8層を追加するには:あなたがあれば、
E9
しかし
$ echo -n "é" | perl -CI -ne 'printf "%vX\n", $_'
出力は今をまた、文字を標準出力に戻してみてください é
ではなく、ユニコード交換文字�
を端末から取得します。文字0xE9
がUnicodeですが、端末がUTF-8を期待する、と0xE9
が有効なUTF-8ではありませんので、これは次のとおりです。
$ echo -n "é" | perl -CI -nE 'printf "$_: %vX\n", $_, $_'
�: E9
正しい出力を取得するには、標準のUFT-8エンコーディング層を追加することができますまた、出力ストリーム(-CO
フラグを使用):
$ echo -n "é" | perl -CIO -nE 'printf "$_: %vX\n", $_, $_'
é: E9
perlunicode
によれば、 "上部" は "大文字" の同義語であり、そして我々は肝炎ができeはP \ 書き込ま{大文字は}同等の\ P {上位}例えば
と
として、\ pは{大文字は} ユニコード "大文字" プロパティを使用して任意の1文字に一致し
バイト文字列に\p{Upper}
を使用しようとすると、Perlからの警告は表示されません。 0xC0
〜0xDE
の範囲のバイトも大文字のプロパティと一致します。 0xC3
と0xA9
(UTF-8で)ここで
$ echo "Whatéver 5" | perl -ape "s/(\p{Upper})/(\1)/g"
(W)hat(�)�ver 5
、手紙
é
は2バイトで表され、
0xC3
がUnicode
Upper
プロパティと一致します:これは、あなたが得た出力を説明し
perl -E 'for $i (0x80..0xFF) {$_=chr $i; printf "%x\n", $i if /\p{Upper}/}'
試してみてください。
(W)hatéver 5
:出力と
echo "Whatéver 5" | perl -CS -ape "s/(\p{Upper})/(\1)/g"
:
あなたの問題を解決するには、(あなたが-CS
を使用して-CI
と-CO
を組み合わせることができます)標準入力と標準出力にUTF-8エンコーディングの層を追加することです
入力と出力にUTF8 PerlIOレイヤがありません。期待どおりに動作します: 'echo -n"Whatéver5 "| perl -Mutf8 -CSDA -pe /(\ p {Upper})/(\ 1)/ g "'となる。参照:[大文字の正規表現の正規表現は "Ó"と一致しませんか?](http://stackoverflow.com/questions/10891643/regex-for-uppercase-unicode-does-not-match-%C3%93) –