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`"

結論

変換が失敗する原因が、rubyのバージョンなのか、OSなのかはちょっと分かりませんが、、、、
とりあえず、NKFを使えば間違いなさそうです。
っということで!

以下、参考にしたサイトです。感謝!!