UTF8からCP932への文字コード変換でIconv::IllegalSequence
こんばんは!
会社でRuby on Railsを使ってますが、Iconvの文字コード変換ではまりましたのでまとめておきます。
IconvでUTF8からCP932に文字コード変換する際、"〜"(波ダッシュ)が文字列に含まれていると
Iconv::IllegalSequenceが発生します。
(後から聞いたところによると結構有名な話のようですね)
Windows XP
以下、rubyのバージョンです。
> ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
以下、irbで確認した結果です。
> require "iconv" => true > Iconv.iconv("CP932", "UTF-8", [0xff5e].pack('U')) Iconv::IllegalSequence: "\357\275\236" from (irb):2:in `iconv' from (irb):2
rescueすることも考えましたが、結局、NKFを使って回避しました。
> NKF.nkf('-sW', [0xff5e].pack('U')) => "\201`"
他のOSやバージョンでは?
どうせなので、Windows以外のOS(バージョン)でも確認してみました。
Linux (Cent OS 5.5)
> ruby -v ruby 1.8.7 (2011-02-18 patchlevel 334) [x86_64-linux]
Cent OSにインストールされている上記バージョンでは、Iconvでも正常に処理されました。
> require "iconv" => true > Iconv.iconv("CP932", "UTF-8", [0xff5e].pack('U')) => ["\201`"]
NKFも合わせて確認してみましたが、こちらも大丈夫でした。
> NKF.nkf('-sW', [0xff5e].pack('U')) => "\201`"
Mac (Snow Leopard)
> ruby -v ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]
Macでも確認してみましたが、こちらも大丈夫ですね。
> require 'iconv' => true >> Iconv.conv('CP932', 'UTF-8', [0xff5e].pack('U')) => "\201`"
NKFも大丈夫でした。抜群の安定感です!
> NKF.nkf('-sW', [0xff5e].pack('U')) => "\201`"