XML文書をcharset="Shift_JIS"で書くためには

なぜ、XML文書をShift_JISで書かないといけないのか?そんな質問には答えられません。 そうしたい人がいるからです。HTMLも同じような問題はあると思います。 Shitf_JISで、どうしてもXMLを書くって人は、一度考えては見ませんか? 私は、Windows98しか持ってないので、その他のシフトJISを使われている環境のことは わかりませんが、日本語WindowsのCP932と、Shitf_JISの違いについて考えては見ませんか?

CP932とは?

Windowsで何気なく使ってるいつもの文字コードのことです。 てことで、文字コード表を、DownLoadしてみましょう。 結構多くの文字が、Windowsで使えることがわかりますよね。 この文字コード表を作るにあたって作った、プログラムもいっしょに入っています。 手で打てる量じゃないので、プログラムを作りました。色は、手でつけたのですけどね。 疲れた...

色分けについて

なぜか、sjis.rtfを見ると、色分けしています。 この意味を書いておきます。

Shift_JIS以外の文字ってなに?

Shift_JIS以外の文字を示す為には、Shift_JISとは、何か?これを明確にする必要があります。 Shift_JISとは、何か?この問題は、私にはよくわかりません。(じゃ、書くなって...) ここでは、JIS X0208:1997の付属書1のシフト符号化表現にで規定されているものであるとしたいです。 このように、決めるとWindowsで私が、いつも何気なく使っている文字たちの中に、 Shift_JIS以外の文字が存在していることを発見できます。 それが、黒色を付けている文字になります。

黒色をつけている文字は、 一般に言われる、NEC特殊文字、NEC選定IBM拡張文字、IBM拡張文字のことです。 JIS X0208で言うところの13区には、NEC特殊文字、 89〜92区には、NEC選定IBM拡張文字、115〜119区には、IBM拡張文字があります。 Windowsの外字エリアは95区〜114区の1880文字です。 人によっては、文字がある人もいることでしょう。後は、未定義です。 ただし、JIS X0208:1997では、このような区画(13,89〜92,115〜119)には、 何の文字も割り当てていませんので、勘違いしないでください。

定義済み実体って、なに?

以下に示す5個の実体は、XMLでははじめから定義させたものとなっている。 XML文書の場所によって、実体参照を使わなくとも、使える場所もあるが、 私は、場合を考えるのは、面倒だと思うので、以下の5個の文字は、 定義済み実体を用いて、表現するとおぼえることにしました。 これは、Shitf_JISのときといったわけではなく、いつも同じです。 文字参照も当然利用することができますが、意味が判り易い意味からも、 実体参照をお勧めしたいです。

& → &
< → &lt;
> → &gt;
' → &apos;
" → &quot;

なぜ、置き換えないといけないの?

これは、絶対にしないといけないか? といわれると、互換性のために使うことが許されています。 メールで、半角カナ(JIS X0201-1997の仮名名用図形文字)といわれる文字を使ってはダメといわれることと、 この置き換えは別です。これは、ISO-2022-JP半角カナといわれる文字を使用する方法が決められていないことが原因です。 では、なぜ使ってはいけないのでしょう? それは、重複符号化の問題(JIS X0208:1997 解説 3.8.2より)に、このように書いてあるからです。 『ISO R 646以降のすべての符号系は、同じ図形文字に二つ以上の符号位置を与える事を禁じてきた。 異なった符合化文字集合中に同じ文字が出現する場合には、これら複数の符合化文字集合を同時に用いる場合には、 一方を使用禁止にする事を規定している。』だから、使わないほうがよいのです。

どう置き換えるの?

半角カナといわれる文字以外について、まとめました。なぜはぶくかって? このHTMLは、ISO-2022-JPで書いてるからです。(じゃ、Shitf_JISで書けって...だって、いやなんだもの...)

0 → 01 → 12 → 23 → 34 → 45 → 56 → 6
7 → 78 → 89 → 9A → AB → BC → CD → D
E → EF → FG → GH → HI → IJ → JK → K
L → LM → MN → NO → OP → PQ → QR → R
S → ST → TU → UV → VW → WX → XY → Y
Z → Za → ab → bc → cd → de → ef → f
g → gh → hi → ij → jk → kl → lm → m
n → no → op → pq → qr → rs → st → t
u → uv → vw → wx → xy → yz → z! → !
# → #$ → $% → %& → &( → () → )* → *
+ → +, → ,. → ./ → /: → :; → ;< → <
= → => → >? → ?@ → @[ → [¥ → \] → ]
^ → ^_ → _` → `{ → {| → |} → } ̄ → ~

当然この表の、信憑性に付いては、責任はもてません。(間違ってると思うから、教えてくださいね。) 私は、JIS X0208:1997の『代替名称を用いるビット組合わせ』を参考にしましたが、正しく理解しているかはわかりません。 鵜呑みにしないほうがいいと思います。

なぜ、"YEN SIGN"と"OVERLINE"は、直接書かないほうが良いの?

ISO/IEC 646では、必要に応じた変更を許しています。JIS X0201-1997はその1つなのです。 しかし、RFC 2046等では、ISO/IEC 646を、US-ASCIIと完全に同一でない限り、 インタネットでは使用しないことを求めていからです。(デフォルトの文字コードは、ANSI X3.4-1986だとしています) US-ASCIIでは、JIS X0201-1997で"YEN SIGN"に与えられているコードは、"REVERSE SOLIDUS"ですし、 "OVERLINE"は、"TILDE"です。 RFC 2046に定められているように混乱を避けるためにも、この違いを明確にするする必要があると思います。 このような問題を解決する方法として、文字参照を利用すれば良いと思います。

私が嫌がる本当の理由

実際に、一番多く(そうだと、たぶん思う)利用されている『シフトジス』とは、 CP932のことで、JIS X0208:1997の定めるところのシフトJISではないと思います。これが問題です。 cp932 to Unicode tableを見ればわかりますが、 CP932の0x5cは、"YEN SIGN"ではなく、"REVERSE SOLIDUS"となっています。 CP932の0x7eは、"OVERLINE"ではなく、"TILDE"となっています。(実際には、もっと多くの違いがあるのですが...)

上記の様に、一番多く(そうだと、たぶん思う)利用されているプラットフォーム上で開発されたアプリケーションが、 WideCharToMultiByteやMultiByteToWideCharを利用して、実装を行う可能性があります。 多くの混乱を起こさないためにも「"YEN SIGN"と"OVERLINE"は、直接書かない」ことを提案したいです。 WideCharToMultiByte, MultiByteToWideCharは、CP_UTF7, CP_UTF8を指定することで、 UTF-7, UTF-8等エンコーディングもサポートできるので非常に便利なんですけどね。

他の文字はどうすれば、良いの?

使わないのも、ひとつの手ですが、XML文書では、 『使用できる文字は,タブ,改行,復帰及び(Unicode及びISO/IEC 10646に規定する)図形文字とする。』 と決まってるので、文字参照を使って、Shift_JISで書いてるとしても、 JIS X0221-1995に存在するすべての文字をあらわすことが可能になります。 (表示できるかは、別の問題です。) 変換表は、Unicode ConsortiumにあるCP932.TXTを使えば良いと思います。

この表を使って手で、置き換えるの?

面倒ですよね。そんなあなたのために(?)、CP932でかかれた、XML文書を自動的に、 Shift_JISに置き換えるプログラムを書いてみました。(あまり、難しいのはだめかも...) マークの中などは、置き換えませんので、注意してください。 思い通りに動かない人は、プログラムのソースをおいておきますので、 なおしてやってください。なおしたら、私にもくださいね。使い方は、基本的にms2sjxml input.xml output.xml等と入力してください。 簡単な説明は、ms2sjxml -helpで説明が出ますので、参考にしてください。

CP932は、そのまま使えないの?

確かにそのとおりです。Internet Assigned Numbers Authorityに、 何か使えそうな、名前は登録されていないかと調べてみると、`Windows-31J'といった名前があります。 これが、CP932をあらわす正式な、名前のようです。しかし残念なことに、まだこの名前を正しく扱えるアプリケーションは少ないようです。 charset="Windows-31J"と書けば、Shift_JISで未定義の文字も、安全に使うことができそうです。


Copyright (C) 1998-1999 YUKI.