@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

sjisの文章をShift_JISとして読むとEncoding::UndefinedConversionError

Rubyの話です。

‘Ⅸ’(ローマ数字の9) を含むsjisの文章をShift_JISとして読むとエラーが起きます。sjisとして読むとエラーが起きません。

たとえば、

''.encode('sjis', 'utf-8').encode('utf-8', 'Shift_JIS')

はエラーが起きて

''.encode('sjis', 'utf-8').encode('utf-8', 'sjis')

はエラーが起きません。 発生するエラーはEncoding::UndefinedConversionErrorです。

最初、Encoding::UndefinedConversionError は変換先が無いときに出るのだろう、と考えました。 ローマ数字がutf-8に含まれていないのかな?、と考えました。 今どきそんな事ある?と疑いつつ

色々試しているうちに、変換元の文字コード指定の問題(sjisShift_JISか)ということに気が付きました。 厳密なShift JISにはローマ数字が含まれていなくて、CP392のようなWindows拡張のShift JISにはローマ数字が含まれているからです。

そこで「Rubyのどこかに文字コードの変換テーブルがあって、その変換元がないときもEncoding::UndefinedConversionErrorがでる」と仮説を立てました。 どこでしょう?

このへんかなあ?C言語なんもわからん・・・