Author:深沢千尋
みなさんこんにちは、深沢千尋です。(公式ページ)
「文字コード【超】研究 改訂第2版NEW!」「すぐわかるPerl」「すぐわかる オブジェクト指向 Perl」の著者です。
ここでは、多くは技術的でないこと、ごくまれに技術的なことをなげやりに書いていきます。
メールは suguwakaruPerl@gmail.com まで。(アットマークは ASCII に)
Twitterはじめました。@query1000です。よろしく~
What's the difference between UTF-8 and utf8?
(UTF-8 と utf8 の違いは?)
UTF-8 は公式な標準です。 utf8 は、何を受け入れるかに関して自由な Perl のやり方です。もしそれほど自由でないものと対話する必要があるなら、 UTF-8 を使うことを考えたくなるかもしれません。自由すぎるものと対話する必要があるなら、utf8 を使わなければならないかもしれません。完全な説明は Encode にあります。
UTF-8 は内部では utf-8-strict として知られます。チュートリアルでは、たとえ内部では実際には utf8 が使われる場合でも一貫して UTF-8 を使っています; なぜなら区別をつけるのは難しく、ほとんど無意味だからです。
例えば utf8 は、9999999 のような、Unicode に存在しない符号位置も使えますが、これを UTF-8 でエンコードすると、代替文字を得ることになります(これはデフォルトの場合です; これを扱う他の方法については Encode/"Handling Malformed Data" を参照してください。)
わかりました、どうしてもと言うのなら:「内部形式」は utf8 であって、 UTF-8 ではありません。 (もしその他のエンコーディングでないのなら。)
$string = decode_utf8($octets [, CHECK]);
equivalent to $string = decode("utf8", $octets [, CHECK]) . The sequence of octets represented by $octets is decoded from UTF-8 into a sequence of logical characters. Not all sequences of octets form valid UTF-8 encodings, so it is possible for this call to fail. For CHECK, see "Handling Malformed Data".
ということだから、文字列から UTF8 フラグを倒すだけではなく、UTF-8 に変換してしまう。
\x{fffd} というのは、存在しない UTF-8 文字で、不当な UTF-8 文字を変換しようとしたので入れたものである。
他にも、utf8::decode とか Encode::_utf8_on というのもあったが、文字列が Shift_JIS だとうまくいかない。
やっぱり Perl(5.8 以降)の文字列は UTF-8 で書いておけということか。
なお、utf8::decode や Encode::_utf8_on は、Encode::decode_utf8 と違って不当な UTF-8 文字列をチェックしない。
あと、Encode::_utf8_on は、use Encode; していても Encode:: を付けて完全修飾しないといけないようだ。
[INTERNAL] だからかしら。
ていうか、http://perldoc.jp/docs/perl/5.10.0/perlunifaq.pod では UTF8 フラグは気にするな、is_utf8 は使うなと書いてあるが、そう言われると気になるのが人間というものね。
参考:
・http://blog.livedoor.jp/dankogai/archives/51004472.html
・http://blog.livedoor.jp/dankogai/archives/51290188.html
http://blog.livedoor.jp/dankogai/archives/51184112.html は勉強になる。
よくある「不当な Unicode 文字列をわざと書いて XSS 攻撃をする」というのを防ぐ方法が書いてある。
| ホーム |