2009年 06月 12日

Perl の utf8 関係が未だ全く理解できない。わからないことがわからないので整理

現状やってること

  • utf8 フラグを全く考慮せずに書き、文字化けした時点で
    1. use utf8 つけたりはずしたり
    2. utf8::encode, utf8::decode を適当にする

最も知りたいこと

  • 確実に文字化けをしない方法


わかること

  • 下位互換性でデフォルトが latin-1
  • use utf8 しててもフラグたたないことがある……
  • 入力時にフラグ立てて 出力時に落とせ、とかいう運用上のやつ

わからないこと

  • encode/decode の覚えかた
    • (いつも適当にどっちかやって is_utf8 ダンプするハメになる。perldoc utf8 みてもわからない)
  • ある文字列 (サブルーチンの返り値とか) が utf8 flagged かどうかわからないときどうすればいいか
    • 誰がその文字列の状態に責任を持ってるのか
    • 誰かが責任をはたせていない場合にできることは?
    • 自分はどこまで責任を持てばいいのか
    • 実際問題これってよくあると思うんだけど……
  • use utf8 の意味
    • フラグが立ったり立たなかったりするのは混乱する
    • use utf8 せずに全部に utf8::decode すべきなんじゃ?
  • 全く utf8 フラグを考慮してない場合にどうなるか
    • 海外製のだいたいの CPAN ライブラリのこと
    • 複雑奇怪な問題を全ての人が「知っている」ことを前提にするのは間違いだと思う
    • 上記責任の問題もあるのだけど、他人が果たせない責任を果たすことはよくあることなのだから、そういうことが確実にできるようでないと使えない。
  • 要は文字化けさせたくないだけ
    • 正規表現マッチを正しくさせるには?
    • 正規表現のエンコーディングは?
  • 普通に開発していて latin-1 が必要になることはあるのか?
    • ライブラリの返り値でそうなることがあるとか?
  • latin-1 と byte 列はちがうのか?
    • utf8 文字列 / latin-1 文字列 / バイト列 ?
  • なんでこんな複雑なのか
    • 下位互換性、というのはわかる、けど、