BLOGTIMES
2012/04/08

Encoding::CompatibilityError と ISO-2022-JP

  ruby  charset  programming 
このエントリーをはてなブックマークに追加

Ruby 1.9 でハマると厄介と聞いていた Encoding::CompatibilityError にとうとうやられてしまいました。
どうも文字列を ISO-2022-JP にしてしまうと、文字列の結合等々が全くできなくなってしまうようです。

$ irb irb(main):001:0> str = "てすと" => "てすと" irb(main):002:0> str_iso2022jp = str.encode('iso-2022-jp') => "\e\x24\x42\x24\x46\x24\x39\x24\x48\e\x28\x42" irb(main):003:0> str_iso2022jp + "a" Encoding::CompatibilityError: incompatible character encodings: ISO-2022-JP and UTF-8 from (irb):3 from /usr/local/bin/irb:12:in `<main>' irb(main):004:0> str_iso2022jp.gsub(/a/,'b') Encoding::CompatibilityError: incompatible encoding regexp match (US-ASCII regexp with ISO-2022-JP string) from (irb):5:in `gsub' from (irb):5 from /usr/local/bin/irb:12:in `<main>'

ちょっとこの動作が良くわからなかったので調べてみたところ、Rubyで ISO-2022-JP は Dummy Encoding として扱われていて結合や比較ができないんですね。

Rubyist Magazine - Ruby M17N の設計と実装

Dummy Encoding

ダミーエンコーディングは Ruby が名前を知っているだけのエンコーディングです。Ruby はただバイト列としてのみこれらを扱い、文字列としてのサポートは一切提供されません。もちろん ASCII のみの文字列との結合・比較等も行うことができません。もっぱらステートフルなエンコーディングがこれにあたり、Ruby 1.9.1 では ISO-2022-JP や UTF-7 がこれに該当します。これらのエンコーディングを Ruby で扱う場合は、stateless-ISO-2022-JP や UTF-8 に変換してから扱うことが推奨されます。

ちょっとこれはメールを扱うときなんかには注意が必要ですね。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4881
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン