文書文字集合

文書文字集合

[1]

文書文字集合 (document character set)
SGML文書の中のすべてのマーク及びデータに使用される文字集合(JIS X 4151‐1992 3. (239))
  • 備考 文書がシステム間で交換される場合、 文字集合は受信側システムの文字集合に翻訳される。

[16] SGML 文書で使う文字集合は、 マーク文字最小データ文字さえ表現できれば、 どんな文字集合でも使えます。 (参考3 7.1 参照。)

[17] 区切子機能をすべて最小データ文字から選んだとすると、 素の SGML では76文字、 Web SGML では 84文字が最小の文字集合となります。

SGML 宣言による文書文字集合の記述

[2] 仕様書: JIS X 4151‐1992 12.1 文書文字集合

SGML の引数の書式と ABNF を合体させたような擬似マーク宣言断片で構文を表すと:

-- 文書文字集合 (172) --
CHARSET
  1*( -- 文字集合記述 (173) --
      BASESET "Public Identifier"
      DESCSET
        1*( -- 文字記述 (176)--
            先頭文字番号 文字個数 (
                                    基本文字集合番号
                                  / 最小表記
                                  / UNUSED
                                  )
            -- SGML 側の --       -- 文字集合側 --
            -- 文字番号  --       -- の文字番号 --
          )
      )

[3] 公開識別子は、 基本文字集合を人間が識別するためのものだそうです。 (12.1.1.1) 規格名、 ISO-IR 登録番号、 標号などの想定読者が理解できるだろうものを識別子に入れることになっています。 (機械処理はするとしても ISO-IR + 実装者が知ってる識別子までが限界でしょう。)]]

公式公開識別子を使う時は、公開文種別CHARSET とします。 (JIS 12.1.1.1)

[4]

[29] 意味を持たない文字は、 非SGML文字として、文字種別 NONSGML に加えられます。 (ってことは、基本文字集合の「意味を持たない文字」 を処理系は知っていないといけないってことです。 それじゃあ「意味を持たない」とはどういう意味か、その定義はないみたいですが、 UNUSED から類推すれば、文字が割り当てられていない符号位置のことを言うのでしょう。)

なお、重要文字でない回避文字も非 SGML 文字になります。

使用例

[6] 文書文字集合・構文参照文字集合の定義の例を。

単純な一面の文字集合

[13] 規格参照具象構文の構文参照文字集合 (表7) :

BASESET "ISO 646-1983//CHARSET
         International Reference Version
         (IRV)//ESC 2/5 4/0"
DESCSET 0 128 0

[14] 文句の付け所がないくらい単純。

[15] ESC 2/5 4/0 は任意の 128文字の集合を意味します。 (公開文指示シーケンス参照。) ESC 2/8 4/0 でないのは、基本集合が単なる ISO-IR 002 の94文字の図形文字集合ではなく、旧 IRV の 128文字の符号化文字集合全体を意味するためだと思われます。

旧 IRV と右半分に +α の8ビット文字集合

[7] JIS X 4151‐1992 表8 の例 :

CHARSET -- 8ビット文書文字集合 --
-- 最初の128文字は、構文参照文字集合と同じである。 --
BASESET "ISO 646-1983//CHARSET
         International Reference Version
         (IRV)//ESC 2/5 4/0"
DESCSET   0    9  UNUSED
          9    2  9
         11    2  UNUSED
         13    1  13
         14   18  UNUSED
         32   95  32
        127    1  UNUSED
BASESET "ISO Registration Number 109//CHARSET
         ECMA-94 Right Part of Latin Alphabet
         Nr.3//ESC 2/9 4/3"
DESCSET 128   32  UNUSED
        160    5  32
        165    1  "SGML User's Group logo"
        166   88  38     -- NONSGML に対する5個の
                            unused を含む --
        254    1  127    -- 127 の未使用位置に動かす --
        255    1  UNUSED -- 255 は、回避文字とする --

[5] IRV:1983 は、

上\下0123456789101112131415
0C0
1C0
2SP!"#Cur%&'()*+,-./
30123456789:;<=>?
4@ABCDEFGHIJKLMNO
5PQRSTUVWXYZ[\]^_
6`abcdefghijklmno
7pqrstuvwxyz{|}~DEL

ISO-IR109 (指示は ESC 2/13 4/3 が正しい。) は、

上\下0123456789101112131415
0**
1**
2NBSPLLDC£Cur**LL§¨ILLLLLLSHY**LL
3°ll^2^3´μll,illllll1/2**ll
4A`A'A^*A"LLLLLLLLLLLLLLLLLLLLLL
5**N"O`O'O^LLLLLLLL×LLLLLLLLLLLL
6a`a'a^**a"llllllllllllllllllllll
7**n"o`o'o^llllllll÷llllllllll上点

(LL は大文字, ll は小文字。)

[28] それが、この文書文字集合では、

上\下0123456789101112131415
0×[09][0A]×[0D]×
1×
2[20]
3
4
5
6
7[7E]×
8×
9×
10{20}{24}{26}{2D}<2E>{2F}
11{30}{3D}<3E>{3F}
12{40}{41}{42}<43>{44}
13<51>{52}
14{60}{61}{62}<63>{64}
15<70>{71}{7F}×

  • [ hh ] は IRV に対応
  • {hh} は IR 109 に対応
  • <hh> は IR 109 に対応するが、文字未割当
  • は「SGML User's Group logo」
  • ×は未使用

[8] 注釈に5個の unused を含むとあるけど実際には6個含んでいるし、127 の未使用位置に動かすという注釈の意図も不明。 もしかして規格の著者は今の IR 109 とは違う表を見ていたんだろうか? 昔の情報が少ない状態なら、なんかの間違いが起こり得なくもない。 IR 109 の指示シーケンスも間違ってるし。

[9] 文字番号の代わりの引数表記、おいおい、 複数文字でもいいのかいと突っ込みたくなりますが、 確かに駄目とはかかれてません。。。そんな。。。

"A" とあったら LATIN CAPITAL LETTER A です、という意味なのかと思ってたけど (規格本文はそうとしか読めないよ)、 こっちの使い方が正しいんでしょうかね? よくわかんない。。。

EUC 型の8ビット多バイト符号

[10] JIS の表9にある例です。 なお、 「EUC 型」という見出しにしましたが、 7ビット部が新 IRV でないので EUC ではありません。

[11]

CHARSET -- 8ビット文書文字集合 --
-- 最初の128文字は、構文参照文字集合と同じである。 --
BASESET "ISO 646-1983//CHARSET
         International Reference Version
         (IRV)//ESC 2/5 4/0"
DESCSET   0    9  UNUSED
          9    2  9
         11    2  UNUSED
         13    1  13
         14   18  UNUSED
         32   95  32
        127    1  UNUSED
BASESET "ISO Registration Number 87//CHARSET
         JIS X 0208//ESC 2/6 4/0 ESC 2/4 2/9 4/2"
        -- JIS X 0208 の文字を G1 集合に指示し、
           列 10‐15 に呼び出す。 --
DESCSET   128  41249  UNUSED
        41377     94  8481    -- 2121 --
        41471    162  UNUSED
        41633     14  8737    -- 2221 --
        41647     11  UNUSED
 (略)
        62625      6  29371   -- 7421 --
        62631   2905  UNUSED

[12] ISO/IEC2022 的に文字でない範囲や JISX0208‐1990 で文字が割り当てられていない範囲を UNUSED にするために涙ぐましい努力がなされています。。。

実際には、文字が割り当てられていない位置は実装が知っていれば SGML 宣言に明示する必要はないと思うので、 大雑把にどばっと割り当てておいても間違いではないのではないでしょうか。 もちろん、明示しておいた方が親切ですし、具体的な文字集合についての知識がない処理系でも正しい扱いが期待できるから良いのですが。。。

[18] 注釈には JIS X 0208 をに呼び出すみたいなことが書かれていますが、 呼び出しのシーケンスはどこにも載ってません。。。 指示しかできません。

指示・呼出しのあるもの

[19] 多符号基本具象構文 (参考5図1) より :

BASESET "ISO 646-1983//CHARSET
         International Reference Version
         (IRV)//ESC 2/5 4/0"
DESCSET   0   14  0
         14    1  "LS0 in ISO 2022"
         15    1  "LS1 in ISO 2022"
         16  112  16
        128   14  UNUSED
        142    1  "SS2 in ISO 2022"
        143    1  "SS3 in ISO 2022"
        144  112  UNUSED

[20] 投げやりな定義ですね。。。 SS2SS3 のために CR を使ってるけど、 GR は未使用なので適当なものを指示・呼び出しして使えないじゃないですか。

もっとも、そもそも文字集合の指定なのに符号拡張が混じって、 つじつまが合わなくなる (例えば 0x30DIGIT ZERO に対応するという記述の意味がない) のに MSOCHAR とか MSICHAR とかわけのわからんものを導入して誤魔化そうとしているのがいけないんです。

本来 SGML 処理系を通す前にシステム文字集合にでも統一しておくとか、 あるいは符号拡張を考慮した文字集合記述ができるかじゃないといけないのに、 何も考えてないからこんなことになる。

[21] よく見ると多符号具象構文では1バイトの呼び出しは使えるけど、 指示や2バイト以上使う呼び出しは使えないじゃん。。。 (たまたまうまく使える場合を除いて。)

[22] >>20-21 それをどう誤魔化すかの解説が参考6 3.1 というわけだ。 だけどこんなことやってる人ほんとにいるんかな? ISO/IEC 2022 も一応考えました。というポーズにしかみえない。

UCS の第0面〜第16面

[23] Web SGML 附属書 L で XML 用の文書文字集合宣言例として出ているもの :

BASESET
    "ISO Registration Number 176//CHARSET
    ISO/IEC 10646-1:1993 UCS-4 with implementation
    level 3//ESC 2/5 2/15 4/6"
DESCSET
    0       9       UNUSED
    9       2       9
    11      2       UNUSED
    13      1       13
    14      18      UNUSED
    32      95      32
    127     1       UNUSED
    128     32      UNUSED
    160     55136   160
    55296   2048    UNUSED  -- surrogates --
    57344   8190    57344
    65534   2       UNUSED  -- FFFE and FFFF --
    65536   1048576 65536

同じく、構文参照文字集合として使われているもの :

BASESET "ISO Registration Number 176//CHARSET
          ISO/IEC 10646-1:1993 UCS-4 with implementation
          level 3//ESC 2/5 2/15 4/6"
DESCSET
    0 1114112 0

[24] どうも、文書文字集合の範囲が XML 1.0 仕様書 (Char 参照。) とは食い違っている気がしますが・・・気にしないことにしましょう。

Boot Strap

[26] SGML宣言で文書文字集合が規定されていたとしても、 受け取った側のシステムがその文書を読めるとは限りません。 SGML 宣言すらも読めないかもしれません。

JIS 12.1 備考によれば、文書を機械処理にかける前に、 システム文字集合に変換しておくのは、文書受領者の責任です。 そして、そのための情報交換には二つの方法があるとされています。

[27] 文書を新しい文字集合に変換する時には、 SGML 宣言の文書文字集合記述引数の文字番号や、 文字参照の文字番号を変更しなければなりません。 (JIS 12.1) このほかにも、 文書中のすべての文字番号が変更の対象となるはずです。

しかし >>26 の状況でシステム文字集合に変換する時にこの修正は大変そうです。 (似たような文書文字集合ならよいですが、 全然違っていたら、文書中の文字参照を探し回らなければならないのです。 SGML 解析器に通す前ですし、 一括置換だと文字データ区間内などでも書き変えてしまう虞があります。)

理論上はともかく、 実際にはまったく異なる文書文字集合など使わないであろうから、 と思いたいところですが、 EBCDIC などが使われていたらと考えると。 文字番号専用の文字集合を指定できるようにしてあればこの問題は回避できそうです。