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 $