俺と OS/2 と Unicode 文字マッピング、あるいは「ま〜りんちゃん(だけにとどまらない)問題」
というわけで OS/2 における(おもに日本語の)文字マッピング問題です。
まああれです、マイクロソフトの CP932 と JIS (X 0221) とで Unicode へのマッピングが異なる文字がある、というのはよく知られたお話で、たとえばマイクロソフト自身がそのことに関するサポート情報を出しているくらいでございます。それではコードページの本家ともいうべき IBM が出している(いた)OS/2 の PC 日本語コードページ (IBM-932) ではどうなっているのかと申しますと、これがまたどうしてどうして、マイクロソフトとも JIS とも違っているのであります。
まあなんといいますか、ともかく以下の表をごらんください。これは http://www.autumn.org/etc/unidif.html の表の一部を引用し、右端に OS/2 の Unicode API を使って独自に調査した変換結果を追加したものです(すべての文字をチェックしたわけではありません)。
Source SJIS | Source JIS | JIS X 0208(+0201) | cp932 | JDK 1.1.7 | JIS X 0221 | NT4.0 | ShiftJIS | VJ++6.0 | Apple | IBM | OS/2 IBM-943 (IBM-932) |
0x5C | 0x5C | 0x00A5 | 0x005C | 0x005C | 0x00A5 | 0x005C | 0x00A5 | 0x005C | 0x00A5 | 0x00A5 | 0x005C/0x00A5 |
0x7E | 0x7E | 0x203E | 0x007E | 0x007E | 0x203E | 0x007E | 0x203E | 0x007E | 0x007E | 0x203E | 0x007E/0x203E |
0x7F | 0x7F | none | 0x007F | 0x007F | none | 0x007F | none | 0x007F | none | none | 0x007F |
0x80 | none | none | none | none | none | 0x0080 | none | none | 0x005C | none | none |
0xA0 | none | none | none | none | none | 0xF8F0 | none | none | 0x00A0 | none | none |
0xFD | none | none | none | none | none | 0xF8F1 | none | none | 0x00A9 | none | none |
0xFE | none | none | none | none | none | 0xF8F2 | none | none | 0x2122 | none | none |
0xFF | none | none | none | none | none | 0xF8F3 | none | none | 0x2026 | none | none |
0x8150 | 0x2131 | 0xFFE3 | 0xFFE3 | 0xFFE3 | 0xFFE3 | 0xFFE3 | 0xFFE3 | 0xFFE3 | 0x203E | 0xFFE3 | 0xFFE3 |
0x815C | 0x213D | 0x2015 | 0x2015 | 0x2015 | 0x2014 | 0x2015 | 0x2015 | 0x2015 | 0x2014 | 0x2014 | 0x2014 |
0x815F | 0x2140 | 0x005C | 0xFF3C | 0xFF3C | 0x005C | 0xFF3C | 0x005C | 0xFF3C | 0xFF3C | 0x005C | 0xFF3C |
0x8160 | 0x2141 | 0x301C | 0xFF5E | 0x301C | 0x301C | 0xFF5E | 0x301C | 0x301C | 0x301C | 0x301C | 0x301C |
0x8161 | 0x2142 | 0x2016 | 0x2225 | 0x2016 | 0x2016 | 0x2225 | 0x2016 | 0x2016 | 0x2016 | 0x2016 | 0x2016 |
0x8163 | 0x2144 | 0x2026 | 0x2026 | 0x2026 | 0x2026 | 0x2026 | 0x2026 | 0x2026 | 0x22EF | 0x2026 | 0x2026 |
0x817C | 0x215D | 0x2212 | 0xFF0D | 0x2212 | 0x2212 | 0xFF0D | 0x2212 | 0x2212 | 0x2212 | 0x2212 | 0x2212 |
0x8191 | 0x2171 | 0x00A2 | 0xFFE0 | 0x00A2 | 0x00A2 | 0xFFE0 | 0x00A2 | 0x00A2 | 0x00A2 | 0x00A2 | 0xFFE0 |
0x8192 | 0x2172 | 0x00A3 | 0xFFE1 | 0x00A3 | 0x00A3 | 0xFFE1 | 0x00A3 | 0x00A3 | 0x00A3 | 0x00A3 | 0xFFE1 |
0x81CA | 0x224C | 0x00AC | 0xFFE2 | 0x00AC | 0x00AC | 0xFFE2 | 0x00AC | 0x00AC | 0x00AC | 0x00AC | 0xFFE2 |
0x5c (\) と 0x7e (~) だけ二通りの文字コードが書かれていますが、これらの文字に関してはオプションによってマッピングを変更することができるためです。デフォルト設定では太字のほうになります(「変換時にパス名であることを考慮する」オプションがあり、デフォルトで有効になっている)。
それ以外の点ではおおまかに言って、OS/2 の IBM-932(Unicode API では、IBM-943 へのエイリアスになっている)の Unicode マッピングは、
- JIS X 0221 でマッピングが定義されていない文字に関しては、マイクロソフトの CP932 とほぼ同じ。
- 定義された部分はおおむね JIS X 0221 に従っている。
- しかし、\(0x815f)、¢(0x8191)、£(0x8192)、¬(0x81CA) はマイクロソフト側に寄せてある。
…という、まあ何と言うかこう、折衷的というか、妥協的というか、そういう曖昧感ただようインプリメンテーションになっています。
- ためしにいろいろ変換してみた表 : os2-dbcs-codemap.zip
- OS/2 向けプログラム : dbucmap.zip