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に含まれていないのかな?、と考えました。 今どきそんな事ある?と疑いつつ
色々試しているうちに、変換元の文字コード指定の問題(sjisがShift_JISか)ということに気が付きました。 厳密なShift JISにはローマ数字が含まれていなくて、CP392のようなWindows拡張のShift JISにはローマ数字が含まれているからです。
そこで「Rubyのどこかに文字コードの変換テーブルがあって、その変換元がないときもEncoding::UndefinedConversionErrorがでる」と仮説を立てました。 どこでしょう?
- https://github.com/ruby/ruby/blob/9e6e39c3512f7a962c44dc3729c98a0f8be90341/transcode.c#L2317-L2323
- https://github.com/ruby/ruby/blob/9e6e39c3512f7a962c44dc3729c98a0f8be90341/transcode.c#L3870-L3875
- https://github.com/ruby/ruby/blob/9e6e39c3512f7a962c44dc3729c98a0f8be90341/transcode.c#L3918-L3923
このへんかなあ?C言語なんもわからん・・・