|
|
||
http://subtech.g.hatena.ne.jp/cho45/comment?date=20090612#c
dan さんがつっこむとおもうので、裏の日記でこっそりと感想メモ。
encode/decode の覚えかた
encode は「Perlの内部表現からなにかのエンコーディングにエンコードする」
decodeは「なにかのエンコーディングからPerlの内部表現にデコードする」
ってこと。
ある文字列 (サブルーチンの返り値とか) が utf8 flagged かどうかわからないときどうすればいいか
誰かが責任をはたせていない場合にできることは?
実際問題これってよくあると思うんだけど……
入出力をするライブラリが責任をもてばよくて、それ以外のライブラリはフラッグの有無を気にする必要はない。DBI とか File related とか、そういうのだけが気にするべき。
use utf8 の意味
フラグが立ったり立たなかったりするのは混乱する
use utf8 せずに全部に utf8::decode すべきなんじゃ?
use utf8 は、「このスクリプトは utf8 でかいてますよ」という宣言になっている。フラッグの存在を意識したら負け。
複雑奇怪な問題を全ての人が「知っている」ことを前提にするのは間違いだと思う
上記責任の問題もあるのだけど、他人が果たせない責任を果たすことはよくあることなのだから、そういうことが確実にできるようでないと使えない。
海外製の CPAN モジュールでもメジャーなものは utf8 フラッグを意識して開発されている。逆にいうと今時 utf8 flag 関連で問題がおきるモジュールは使わない方がいい(というのはたぶん、いいすぎ)。
use utf8; していれば、その regexp は utf8 でマッチしてくれる。regexp も string も両方 flagged にしておくのがポイント。
普通に開発していて latin-1 が必要になることはあるのか?
ライブラリの返り値でそうなることがあるとか?
decode を明示的にしてない文字列はすべて latin-1 扱いになる。これは下位互換のため。
latin-1 と byte 列はちがうのか?
用語の問題ですね。バイト列とlatin-1文字列は同じものですね。バイト列という表現は python から輸入してきたものかとおもいます。
なんでこんな複雑なのか
下位互換性、というのはわかる、けど、
慣れてしまえばそんなに問題にならないんですけどね。