古い記事
ランダムジャンプ
新しい記事
自分用メモ。
最近良く使うおまじない、というかイディオム。

utf8::decode($text) unless utf8::is_utf8($text);
(追記:より良いおまじない。詳細は後述。
$text = Encode::decode_utf8($text) unless utf8::is_utf8($text);


Perl の CGI モジュールでクエリから得られるデータの文字列のutf8フラグの有無が環境によって違うことがあってイライラ。
でもこのおまじないでなんとかなった。

こんな文脈で使う:
use utf8;
use CGI;
...
my $text = $q->param('text') || "";
utf8::decode($text) unless utf8::is_utf8($text);
...

ref.
- Google ソースコード検索:utf8::decode unless utf8::is_utf8

追記090913:
dankogai さんに添削頂きました。いつもありがとうございます!

- #perl - utf8::decode()ではなくEncode::decode_utf8()を使うべき理由 (404 Blog Not Found)
http://blog.livedoor.jp/dankogai/archives/51290188.html
utf8::decode()は、定数文字列、すなわちソース内の文字列に限って利用すべきでしょう。外部入力はEncodeに振りましょう。
了解でっす!

utf8::decode() は不正なUTF-8バイト列に対して何もしてくれないけど、Encode::decode_utf8() は不正な文字を特殊な文字に置き換えてくれるとのこと。後々の処理を考えるとやっぱ Encode!