OS/2 の文字コード事情に関するメモ少々

なんか忘れそうだからすこし書き残しておく…

というか昔、OS/2Unicode 文字マッピング(何て言ったらいいんですかね)についてすこしだけ調べて書いたことがあって、そのときはなんつーかこう、折衷的ではあるよなあなんていう感想を持ってしまったのですが、すこし勘違いしていたらしい。というのはこの折衷ぶりが OS/2 の実装固有のものだと思っていたのですが、最近ふと思い立って大元の IBM の変換表と照合してみたら IBM-943 の UCS-2 変換表とほぼ一致していた(developerWorks の download ページで "Character Data Conversion Tables" を探せば落とせます)。よく考えたら当たり前でしたが。

んでまあ、

  1. IBM の変換表アーカイブ (cdctables.zip) をほどくと 7 つぐらい zip が出てくる。
  2. ファイル構成は Intro.zip の中のテキストを見るとおおまかに分かる。
  3. 各種コードページと UCS-2 の対応表は Package2.zip の中に入っている。
  4. とりあえず IBM-943.zip だけ Package2.zip の中からほどく(OS/2 の UCONV では、IBM-932 の実体は IBM-943 へのエイリアス)。
  5. IBM-943.zip をほどく。ファイル構成とか説明とかは 03AF34B0.PACKAGE に書いてある。
  6. UCS-2IBM-943 の変換表は 34B003AF.RPMAP14A で、IBM-943→UCS-2 は 03AF34B0.TPMAP13A かな?(もっと新しい RPMAP15A と TPMAP14A もあるが、比較対象の Warp V4 が「20世紀 OS」だから…)

で、このへんの表と、実際に OS/2 Warp V4 日本語版の Unicode API を使って変換させてみた結果とを照合してみた結果、違いは以下の通り(IBM-943→UCS-2 のみ照合)。

SJIS (IBM-943)UCS-2
charcodeIBMCDRAOS/2
EB9FU+E758 ()
EBA0U+E759 ()
EBA1U+E75A ()
EBA2U+E75B ()
EBA3U+E75C ()
EBA4U+E75D ()
EBA5U+E75E ()
EBA6U+E75F ()
EBA7U+E760 ()
EBA8U+E761 ()
EBA9U+E762 ()
EBAAU+E763 ()
EBABU+E764 ()
EBACU+E765 ()
EBADU+E766 ()
EBAEU+E767 ()
EBAFU+E768 ()
EBB0U+E769 ()
EBB1U+E76A ()
EBB2U+E76B ()
EBB3U+E76C ()
EBB4U+E76D ()
EBB5U+E76E ()
EBB6U+E76F ()
EBB7U+E770 ()
EBB8U+E771 ()
EBB9U+E772 ()
EBBAU+E773 ()
EBBBU+E774 ()
EBBCU+E775 ()
EBBDU+E776 ()
EBBEU+E777 ()
EBBFU+E778 ()
EBC0U+E779 ()
EBC1U+E77A ()
EBC2U+E77B ()
EBC3U+E77C ()
EBC4U+E77D ()
EBC5U+E77E ()
EBC6U+E77F ()
EBC7U+E780 ()
EBC8U+E781 ()
EBC9U+E782 ()
EBCAU+E783 ()
EBCBU+E784 ()
EBCCU+E785 ()
EBCDU+E786 ()
EBCEU+E787 ()
EBCFU+E788 ()
EBD0U+E789 ()
EBD1U+E78A ()
EBD2U+E78B ()
EBD3U+E78C ()
EBD4U+E78D ()
EBD5U+E78E ()
EBD6U+E78F ()
EBD7U+E790 ()
EBD8U+E791 ()
EBD9U+E792 ()
EBDAU+E793 ()
EBDBU+E794 ()
EBDCU+E795 ()
EBDDU+E796 ()
EBDEU+E797 ()
EBDFU+E798 ()
EBE0U+E799 ()
EBE1U+E79A ()
EBE2U+E79B ()
EBE3U+E79C ()
EBE4U+E79D ()
EBE5U+E79E ()
EBE6U+E79F ()
EBE7U+E7A0 ()
EBE8U+E7A1 ()
EBE9U+E7A2 ()
EBEAU+E7A3 ()
EBEBU+E7A4 ()
EBECU+E7A5 ()
EBEDU+E7A6 ()
EBEEU+E7A7 ()
EBEFU+E7A8 ()
EBF0U+E7A9 ()
EBF1U+E7AA ()
EBF2U+E7AB ()
EBF3U+E7AC ()
EBF4U+E7AD ()
EBF5U+E7AE ()
EBF6U+E7AF ()
EBF7U+E7B0 ()
EBF8U+E7B1 ()
EBF9U+E7B2 ()
EBFAU+E7B3 ()
EBFBU+E7B4 ()
EBFCU+E7B5 ()
EC40U+E7B6 ()
EC41U+E7B7 ()
EC42U+E7B8 ()
EC43U+E7B9 ()
EC44U+E7BA ()
EC45U+E7BB ()
EC46U+E7BC ()
EC47U+E7BD ()
EC48U+E7BE ()
EC49U+E7BF ()
EC4AU+E7C0 ()
EC4BU+E7C1 ()
EC4CU+E7C2 ()
EC4DU+E7C3 ()
EC4EU+E7C4 ()
EC4FU+E7C5 ()
EC50U+E7C6 ()
EC51U+E7C7 ()
EC52U+E7C8 ()
EC53U+E7C9 ()
EC54U+E7CA ()
EC55U+E7CB ()
EC56U+E7CC ()
EC57U+E7CD ()
EC58U+E7CE ()
EC59U+E7CF ()
EC5AU+E7D0 ()
EC5BU+E7D1 ()
EC5CU+E7D2 ()
EC5DU+E7D3 ()
EC5EU+E7D4 ()
EC5FU+E7D5 ()
EC60U+E7D6 ()
EC61U+E7D7 ()
EC62U+E7D8 ()
EC63U+E7D9 ()
EC64U+E7DA ()
EC65U+E7DB ()
EC66U+E7DC ()
EC67U+E7DD ()
EC68U+E7DE ()
EC69U+E7DF ()
EC6AU+E7E0 ()
EC6BU+E7E1 ()
EC6CU+E7E2 ()
EC6DU+E7E3 ()
EC6EU+E7E4 ()
EC6FU+E7E5 ()
EC70U+E7E6 ()
EC71U+E7E7 ()
EC72U+E7E8 ()
EC73U+E7E9 ()
EC74U+E7EA ()
EC75U+E7EB ()
EC76U+E7EC ()
EC77U+E7ED ()
EC78U+E7EE ()
EC79U+E7EF ()
EC7AU+E7F0 ()
EC7BU+E7F1 ()
EC7CU+E7F2 ()
EC7DU+E7F3 ()
EC7EU+E7F4 ()
EC80U+E7F5 ()
EC81U+E7F6 ()
EC82U+E7F7 ()
EC83U+E7F8 ()
EC84U+E7F9 ()
EC85U+E7FA ()
EC86U+E7FB ()
EC87U+E7FC ()
EC88U+E7FD ()
EC89U+E7FE ()
EC8AU+E7FF ()
EC8BU+E800 ()
EC8CU+E801 ()
EC8DU+E802 ()
EC8EU+E803 ()
EC8FU+E804 ()
EC90U+E805 ()
EC91U+E806 ()
EC92U+E807 ()
EC93U+E808 ()
EC94U+E809 ()
EC95U+E80A ()
EC96U+E80B ()
EC97U+E80C ()
EC98U+E80D ()
EC99U+E80E ()
EC9AU+E80F ()
EC9BU+E810 ()
EC9CU+E811 ()
EC9DU+E812 ()
EC9EU+E813 ()
FA59U+2116 (№)U+F86F ()

OS/2Unicode API だと、外字だかなんだかわかんない部分のマッピングが増えておりました。どんな文字がはいるのか、私には全然わかりません(だって OS/2 上でも文字が表示されないんだもん)。

ただし、最後の「№」(X'FA59') がなんつーか。ちなみに NEC 文字のほうの「№」(X'8782') はふつーに U+2116 にマッピングされます。つまり IBM 拡張のと NEC のとで別文字扱い。
さらに UCS-2 から IBM-943 への変換だと表のリビジョンによって結果が違う。これについては 03AF34B0.PACKAGE 中に言及があるので、すこし引用。

*   January 2003
*     - Change UCS to 943 mapping (RPMAP, UPMAP) for 13 dupicated chars in IBM sel chars and NEC sel chars
*     - e.g. In old mapping, U+2116 map to x'FA59' (IBM sel), but now U+2116 map to x'8782' (NEC sel).
*     - This change is for the consistency with Windows MS-932 mapping.
*
*           New)                         Old)
*
*                943        UCS               943        UCS
*                ----       ----              ----       ----
*                8782 <---> 2116              FA59 <---> 2116
*                8782 <---  F86F              FA59 <---  F86F
*                FA59  ---> 2116              8782  ---> 2116
*                8784 <---> 2121              FA5A <---> 2121
*                FA5A  --->                   8784  --->
*                8754 <---> 2160              FA4A <---> 2160
*                FA4A  --->                   8754  --->
*                ...                          ...
*                875D <---> 2169              FA53 <---> 2169
*                FA53  --->                   875D  --->
*                878A <---> 3231              FA58 <---> 3231
*                FA58  --->                   878A  --->

Windows との一貫性ですか。大変ねえ。
IBM-932 とか IBM-943 の指定できる iconv だとこのへんどうなってるんでしょうね。