sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

文字コード超研究 17章〜18章

文字コード「超」研究 改訂第2版

文字コード「超」研究 改訂第2版

前回の続き

17章 Shift_JIS

日本の文字セットのデファクトスタンダートして長く君臨して来た。 以下の文字集合をサポートする

構造としては、1バイト文字と2バイト文字の可変長ステートレスな文字コード系。 JIS漢字コード(JIS X 0208をGLに呼び出したコード)の1バイト目を、半角英数字(JIS X 0201ローマ字)と半角カナ(JIS X 0201カタカナ)を避ける位置にうまくシフトさせて配置したもの。

C1制御文字が使えないが、ESC+0x40-0x5fの2バイトで代用する。また、JIS X 0212Shift_JISが出来たときには存在しなかったため利用できない。

領域

  • 0x00-0x1f: C0制御文字
  • 0x20-0x7f: 半角英数字(JIS X 0201 ローマ字)
  • 0x80: 未使用
  • 0x81-0x9f: JIS基本漢字1バイト目(JIS X 0208 1〜62区漢字)
  • 0xa0: 未使用
  • 0xa1-0xdf: 半角カナ(JIS X 0201 カタカナ)
  • 0xe0-0xef: JIS基本漢字1バイト目(JIS X 0208 63〜94区漢字)
  • 0xf0-0xff: 未使用

文字種判定

先頭から1バイトずつ辿るとき、以下のように文字種を判定できる

  • 0x00-0x1fならC0制御文字
  • 0x20-0x7fなら半角英数字
  • 0xa0-0xdfなら半角カナ
  • 0x81-0x9f,0xe0-0xefなら次のバイトとあわせてJIS基本漢字

0x5c問題

JIS基本漢字の2バイト目に0x5cが含まれるため、¥をエスケープ文字とするC言語等で、プログラマーを悩ませてきた。処理系が賢くなった今となってはどうでもよい話。

Shift_JIS0213

JIS X 0213の附属書1には、JIS X 0213を搭載した、Shift_JISに互換性のある Shift_JIS0213が参考掲載されている。Shift_JISの 0xf0-0xfcに、JIS X 0213漢字第2面の1バイト目(第4水準漢字)が割り当てられている。

従来の機種依存文字の範囲が潰されているため、各メーカーの対応は消極的。Microsoftは、JIS X 0213への対応をUnicodeで行っている。

18章 機種依存文字

Microsoft Windowsでは、公的な文字セットを勝手に拡張して使っている。これは、対象とする国に分けてCPnnn(コードページ)という番号で管理されている。

  • ASCII - CP437 アメリカ/カナダ
  • ISO-8859-1 - CP1252 西ヨーロッパ
  • Shift_JIS - CP932 日本

このように、メーカーが拡張したコードのことを、ベンダーコードと呼ぶ。

MS,Apple,IBM,Adobe,Fujitsu,Xerox等々、色々な会社がベンダーコードを持っている。 この、ベンダーコードには存在するが、基本となる文字コードには存在しない文字を、機種依存文字と呼ぶ。

CP437

アメリカやカナダで使われたコードページ。元々はIBM-PCのために生まれた文字セット。 0x00-0x1f,0x7fの32個のコードポイントには、2通りのグリフが割り当てられている。 一つはこれまで通りのC0制御文字、もう一つは、キャラクタモードで動かしたときに表示されるもの。 キャラクタモードなんて現代ではもう使われていないので、あまり気にしなくてよさげ。

CP1252

今でも欧米でよく使われる。ISO 8859-1を元にしたもので、0x80-0x9fに西欧特殊文字を設定している。IANA登録名は、Windows-1252。

CP932

日本語用のコードページ。Shift_JISを拡張したもので、IANA登録名はWIndows-31J。 1982年にShift_JISが開発された時に、MicrosftがMS-DOSの日本語コードとして採用。

1993年、WIndows 3.1Jの発売にあたり、文字コードを整理し、NECとIBMが登録していた機種依存文字を再配置してCP932を統一。これがWindows-31Jとなる。

重複符号化の弊害

ラウンドトリップコンバージョンが保証されない(他の文字コードから変換したあと元の文字コードに戻せる保証がない)ため、Windowsでは以下のロジックで文字の選択を行っている。

  1. JIS X 0208:1990の登録文字の場合は、これに統一する
  2. NEC特殊文字IBM拡張文字が重複する場合は、NEC特殊文字に統一する
  3. NEC選定IBM拡張文字とIBM拡張文字が重複する場合は、IBM拡張文字に統一する

Apple Macintosh

Macintoshに搭載されたOS。 Mac-Roman(Macintosh Standard Roman Character Set)はISO 8859-1やWIndows-1252と文字レパートリーはほぼ一緒。

日本語に関しては、Shift_JISをベースにしたもの。

  • アップル標準システム外字
  • 漢字Talk6.0.7互換システム外字
  • Windows標準システム外字

OS Xでは、CP932互換のOpenTypeフォントのヒラギノがサポートされている。

EUC-JPファミリー

以下の3つが三すくみの膠着状態。そうこうしている間にUnicodeで解決という事態に落ち着きそう。

  • EUC-JP - 本家。補助漢字が使え、重複文字がないが、NEC特殊文字IBM拡張文字が使えない。
  • eucJP-ms - TOGという非営利団体のJVCが策定したもの。補助漢字やNEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字が全て使えるが、重複文字がある。
  • CP51932 - MSが作成したもの。NEC特殊文字、NEC選定IBM拡張文字が使え、重複文字がないが、補助漢字が使えない。

長年の王者であるShift_JISと、機種依存文字の問題に関する章が終了。互換性や複数言語への対応といった問題を解決するためにUnicodeへの統一が渇望されたのだと思います。 最近の6.0や7.0の状況は知らないのでなんとも言えませんが、あっちはあっちでぐだぐだな状況なような気がしないでもないのですが…

さて、いよいよ次章は160ページにもわたるUnicodeの章。この章を読む為だけにこの本を買ったと言っても過言じゃないのですが、全670ページの1/4が割かれた超大作なので、頑張って理解しないといけませんね。

次回へ続く