以下のように一部の文字を電子形式に変換しようとしています。
tr 'abcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz'
しかし、これはうまくいきません。検索して探すtr
UTF-8はサポートされていません。。だから私はその質問に対する答えに基づいてPerlを使ってみました。
perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
しかし、まだ役に立ちません。私はもっと簡単なバージョンを試しました
$ echo abca | perl -C -pe 's/a/a/g'
ï½bcï½
$ echo abca | perl -C -pe 'tr/a/a/'
ïbcï
PerlはまだマルチバイトUTF-8文字をバイトとして扱っているようです。
この文字を正しく変換するにはどうすればよいですか?
答え1
GNUとBSDはどちらもsed
適切なロケールでマルチバイトを認識します。y
コマンドは次のようになります。tr
:
$ echo hello | sed -e 'y/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
hello
ロケールがUTF-8の場合、実行可能なほとんどの場所で動作します。
Perlの問題は、マルチバイト文字をバイトとして扱うほど簡単ではありません。入力を非常によく理解し、出力をエンコードすることもあります。ソースコードわからない:
$ echo abc | perl -C -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'|hexdump -C
00000000 c3 af c2 bd c2 81 0a |.......|
「a」のUTF-8エンコーディングは、ef bd 81
「b」を2番目のバイトとして扱い、出力時にエンコードを試み、「c」にも同じことがわかります。あなたuse utf8
Perl(5)ソースコード自体をこの方法でエンコードする必要があります。;-C
プログラムが実行されている場合にのみIOを制御します。
use utf8;
文字列を入力する-e
か-Mutf8
コマンドラインで使用:
$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc
Perl 6は多くの問題のようにこの問題を解決しますが...