危険があぶないデシ

いわゆる半角カナの危険性

魔術幻燈さんがいわゆる半角カナの危険性という文書を公開しています。作者は HTML にかなり精通しておられる方で、HTML4.0仕様書邦訳計画でもお世話になっているのですが、これはちょっと違うだろうと思ったので思わずネタにしてしまいました。

HTML2.0 で日本語を論じるなかれ

のけぞり度:

HTML で半角カナを使うとまずい、という話なのですが……。

まず、IANAにおける登録事項とRFC1866(HTML2.0)でのThe HTML Coded Character Setを比較してみてください。

いきなりダウトです。HTML2.0(RFC1866) で半角カナを使ってはいけないと言うのは当然の話で、そもそも HTML2.0 は日本語が使える仕様になっていないのです。SGML 宣言を見てみますと。

CHARSET
        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 100//CHARSET
                  ECMA-94 Right Part of
                  Latin Alphabet Nr. 1//ESC 2/13 4/1"

        DESCSET  128  32   UNUSED
                 160  96    32

ISO 646(ASCII文字)にラテン文字が加えられていることが分かりますが、それだけです。半角カナはもちろん、漢字もひらがなも使えません。UNUSED ですらないのです。というわけで、ここで HTML2.0 を持ち出すのは全くの筋違いです。

もっとも、HTML2.x(RFC2070) や HTML4.0 を持ち出せば問題ありません。HTML4.0 の SGML宣言を見るとこのようになっています。

CHARSET
      BASESET  "ISO Registration Number 177//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   1056768 57344

ということで、見れば分かるとおり(SGML宣言の読み方を参照のこと)、#127 から#159 までが Unused だという主張自体は特に問題ありません。

Shift_JIS は半角カナを押し込んでいる?

のけぞり度:★★★★

それから、Shift_JIS の説明になるのですが、まず IANAcharacter-sets を引用して……

Name: Shift_JIS  (preferred MIME name)
MIBenum: 17
Source: A Microsoft code that extends csHalfWidthKatakana to include 
        kanji by adding a second byte when the value of the first 
        byte is in the ranges 81-9F or E0-EF.
Alias: MS_Kanji 
Alias: csShiftJIS

と、ここまでは全く問題ありませんが、

IANAの登録事項によると、このMicrosoft codeでは、csHalfWidthKatakanaを押し込むために、1バイト目が 81-9F か E0-EF になっているときに2バイト目をくっつけるわけです。

ここでのけぞってしまいました。違います。これは、"csHalfwidthKatakana" すなわち JIS_X0201 を元にし、それを拡張して漢字を使えるようにしたという意味です。そもそも JIS_X0201 には最初から半角カナが含まれています。それを Microsoft が拡張して漢字を使えるようにした、と言っているのです。「1バイト目が 81-9F のとき……」というのは漢字を使うときの話です。そういうわけですから、

(僕はこれを『1バイト文字』と解していましたが、この定義は少し違うようですね。)

違わないのです。Shift_JIS では、半角カナは JIS_X0201 とまったく同じコードで表現します。つまり、半角カナは『1バイト文字』なのです(もっとも、EUC-JP や Unicode ではまた違います)1バイト目が 81-9F か E0-EF になっているときに2バイト目をくっつけて表すのは漢字です。半角カナではありません。

Shift_JIS では漢字が使えないの?

のけぞり度:★★

つまり、#127 から#159 までは、半角カナを表わすための1バイト目のコード番号とHTMLの制御記号を表わすためのコード番号がもろにぶつかってしまい、障害の原因となってしまいます。

はい、今までの話からお分かりだと思いますが、そうだとすると、Shift_JIS では漢字が使えないと言う結論になってしまいます。半角カナでなく。

では漢字が使えないのか、というとそんなことはありません。そもそも SGML宣言の DESCSET の値というものは、符号化されたビット列ではなく、文字を対象にしています。ここでの数値は、BASESET で指定されている文字集合におけるコード番号を指すのです。HTML2.x や HTML4.0 では ISO10646 が指定されていて、これは Unicode2.0 と等価です。

たとえば平仮名の「あ」は Unicode では 12354 番目の文字ですから、仮に DESCSET に 12354 UNUSED などと書かれていれば「あ」が UNUSED となります。

Shift_JIS では「あ」は 82A0 という 16 進コードで表現されますが、そんなことは全く関係ありません。符号化されたビット列について論じているのではなく、文字について論じているのです。

なお、実際には「あ」は UNUSED ではありません。他の平仮名、片仮名、漢字もちゃんと使えようになっています。

では半角カナは?

そして Unicode では、JIS X 0201 のカタカナ部分に該当する文字(いわゆる半角カナ)が FF61 から FF9F の間にちゃんと存在しています。10進数では 65377 から 65439 の間です。HTML2.x でも HTML4.0 でも、57344 以降の文字は UNUSED ではなく、普通に使える文字となっています。つまり半角カナも使えるのです。

そう言うわけで、仕様的には半角カナが使えます。半角カナで不都合を起こす端末があるとしても、それは端末の側の責任というものです。もっとも、そういう端末が存在するのであれば半角カナの使用を控えた方が良い、という意見には異存ありません。

結局、半角カナは仕様上は使えるけれども、使わない方が無難である、という程度の認識で良いでしょう。


のけぞる本

HTML鳩丸倶楽部

水無月ばけら, MINAZUKI Bakera
E-mail: bakera@star.email.ne.jp