Unicode文字を翻訳する方法は? [コピー]

Unicode文字を翻訳する方法は? [コピー]

以下のように一部の文字を電子形式に変換しようとしています。

tr 'abcdefghijklmnopqrstuvwxyz' 'abcdefghijklmnopqrstuvwxyz'

しかし、これはうまくいきません。検索して探すtrUTF-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 utf8Perl(5)ソースコード自体をこの方法でエンコードする必要があります。;-Cプログラムが実行されている場合にのみIOを制御します。

use utf8;文字列を入力する-e-Mutf8コマンドラインで使用:

$ echo abc | perl -C -Mutf8 -pe 'tr/abcdefghijklmnopqrstuvwxyz/abcdefghijklmnopqrstuvwxyz/'
abc

Perl 6は多くの問題のようにこの問題を解決しますが...

関連情報