内部文字コード→外部コードの変換

引き続き http://www.smalltalk.jp/pipermail/squeak-ja/2005-July/002528.html に関係するコードを眺めています。大島さんと阿部さんのm17nのペーパーを改めて読み直したり。
今のコードだと EncodedCharSet のサブクラス(Unicode以外)で、同一の#charFromUnicode: を共有しています。そこでは次のようなことを行っています:

  • UCS文字コードが1〜255の場合は、UCS=ISO8859-1が成立する範囲なので、Characterオブジェクトに変換する
  • UCS文字コードが256〜の場合は、MultiCharacterオブジェクトに変換する(JISX0208の場合leadingChar=1)

ShiftJISTextConverter>>nextPut:ToStream: では、MultiCharacterオブジェクトの場合ちゃんとコード変換してますが、Characterオブジェクトの場合内部コードをそのままストリームに書き込みます。その結果、UCS=0xDF($×)などはShiftJISでの半角カナ文字などに変換されてしまっているようです。
そもそも、ISO-8859-1の0x80以上の部分は、JISX0208では定義域ではないので、sumimさんが書かれていたように EncodedCharSet (class)>>charFromUnicode:で Characterとして扱う範囲を修正してしまうのが正しいように思います。しかしこのメソッドを他のEncodedCharSetで共有しているため、JISX0208以外の場合にも影響してしまいます。たとえばLatin1の0x80以上の、本来なら Characterで表現できていたものでも MultiCharacterにマップされることになってしまい、リスクを伴うような気がします。Latin1ならこの程度まではわかりますが、KSX1001とかはちゃんと調べないとよくわからない。ここまで考えたところで、今日は力尽きました。