- blogs:
- cles::blog
« 都内は桜が満開に :: md5Crack.com で md5 を解読 »
2012/04/08

Encoding::CompatibilityError と ISO-2022-JP



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 を使ってログインすることができます。
« 都内は桜が満開に :: md5Crack.com で md5 を解読 »
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112155)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110792)
3 . 年次の人間ドックへ(110384)
4 . 2023 年分の確定申告完了!(1つめ)(109931)
5 . 三菱鉛筆がラミーを買収(109830)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110792)
3 . 年次の人間ドックへ(110384)
4 . 2023 年分の確定申告完了!(1つめ)(109931)
5 . 三菱鉛筆がラミーを買収(109830)
cles::blogについて
Referrers