Perl-users.jp

Unicode にまつわる入出力のフローについて

Perl プログラムの処理フローは下記のようになる。

もし入力がバイナリであって、それをバイナリとして操作するのならば decode するべきではないですが。 そうではないすべてのケースで decode するべきです。

データがどのようにエンコードされえいるかを知らなくてはきちんとデータを decode することはできません。 もし、あなたがどのようなエンコーディングをつかうかを選択できるならば UTF-8 を選ぶのがよいでしょう。

my $foo   = decode('UTF-8', get 'http://example.com/');
my $bar   = decode('ISO-8859-1', readline STDIN);
my $xyzzy = decode('Windows-1251', $cgi->param('foo'));

あなたはこのような処理をすることにより、バイトではなく文字をあつかうようになりました。 これは、substr や length などの組み込み関数にも適用されるので便利です。

$body = encode('UTF-8', $body);

もしあなたがバイト列の長さを知りたいのならば、encode すればよいです。encode されて バイト列になった文字列にたいしては length は文字数ではなくバイト数をかえします。 文字数は文字列でのみ数えられるので、バイト列から文字数をかぞえることはできません。

my $byte_count = length $body;

あなたのつかっているプロトコルが文字列エンコーディングの情報のやりとりをサポートしている ならば、その情報をつかいましょう。たとえば E-mail と HTTP は MIME ヘッダをサポートしていて Content-Type ヘッダを取得することができます。バイト数がわかっちゃう Content-Length ヘッダもあります。

    "Content-Type: text/plain; charset=UTF-8",
        "Content-Length: $byte_count"

目次へ

Last modified: $Date: 2008-05-22T09:21:23.154313Z $