インターネット上で日本語を扱う際には、現在、3種類の文字コードが使われています。いずれも1文字を2バイトで表しますが、1バイトを 7 bit で表すものと、8 bit で表すものとがあります。
実はこれ、『文字符号化方式』であって、元になる『符号化文字集合』にはいずれも別途に JIS で決めた文字の集まり(JIS X 0208) + 独自拡張を使っていたりするんで、この際区別しときましょうか。
「コンピュータではこの字を使う」と決めた、表のような字引のような存在。それぞれの字を実際にどのように表現するかは、また別の問題。
で、決められた文字にコードを割り振って、バイトで表される空間に収める工夫が必要なわけです。
以下は、IANAにおける登録事項です。
Name: ISO-2022-JP (preferred MIME name) [RFC1468,Murai] MIBenum: 39 Source: RFC-1468 (see also RFC-2237) Alias: csISO2022JP 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 Name: Extended_UNIX_Code_Packed_Format_for_Japanese MIBenum: 18 Source: Standardized by OSF, UNIX International, and UNIX Systems Laboratories Pacific. Uses ISO 2022 rules to select code set 0: JIS Roman (a single 7-bit byte set) code set 1: JIS X0208-1990 (a double 8-bit byte set) restricted to A0-FF in both bytes code set 2: Half Width Katakana (a single 7-bit byte set) requiring SS2 as the character prefix code set 3: JIS X0212-1990 (a double 7-bit byte set) restricted to A0-FF in both bytes requiring SS3 as the character prefix Alias: csEUCPkdFmtJapanese Alias: EUC-JP (preferred MIME name)
このように、IANAに登録されているので、3種類とも事実上の国際規格ということになるでしょう。SMTPとは異なり、HTTPはオクテット、すなわち8ビットを通すように設計されていますので、Web上では8ビットの文字集合も使うことができるのです。(半角カナを使用するのは危険ですが。)主要なWebブラウザは、この3種類の日本語文字集合に対応しています。
character set というよりは encoding じゃないかという意見があって当然ですけど、Media Type としては encoding とは言わず、character set と呼んでいます。ガタガタ言わずに覚えましょう。って、自分で言ってるし(自爆)
ただし、日本語文字集合の判別にWebブラウザが失敗すると、文字化けを起こします。
これについて、これまでの歴史的な経過をまとめますと
content := "Content-Type" ":" type "/" subtype *(";" parameter) ; Matching of media type and subtype ; is ALWAYS case-insensitive. parameter := attribute "=" valueその使用例として
Content-type: text/plain; charset="us-ascii"が挙げられている。さらに、新規なsubtypeの定義として
の一行を含んでいればよいという。これをincludeする方法の一つとしてContent-Type: text/html;charset=ISO-2022-JP
を文書のHEADのできるだけ初めのほうに置くことができる、とある。<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-2022-JP">
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=x-sjis"> <META HTTP-EQUIV="content-type" CONTENT="text/html;charset=x-euc-jp">の記述は、ここに始まる。従って、これはNetscape独自のHTMLである。
は、いずれも正式なHTMLである。Mozilla3,IE3はこの記述がなくても正しく表示できるようである。<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=Shift_JIS"> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=EUC-JP">
となります。 以上の点を考慮すると、お勧めできる方法としては
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-2022-JP">と書いておく。
<A NAME="linkname" HREF="URLs" TITLE="name" CHARSET="Shift_JIS"></A>のように、CHARSET指定を入れる。
Content-Type: text/html;charset=ISO-2022-JPと書き出し、出力はISO-2022-JPへ変換されるようにしておく。
<TEXTAREA NAME="text" ROWS=10 COLS=80 WRAP="soft" LANG="JA" ACCEPT-CHARSET="ISO-2022-JP,Shift_JIS,EUC-JP"></TEXTAREA>のように、ACCEPT-CHARSETを指定する(HTML i18N 準拠)。 または、FORMにおいて
<FORM METHOD="post" ACTION="urls" ENCTYPE="text/plain" LANG="JA" ACCEPT-CHARSET="ISO-2022-JP,Shift_JIS,EUC-JP"></FORM>のようにACCEPT-CHARSETを指定する(HTML 4.0 準拠)か
<FORM METHOD="post" ACTION="urls" ENCTYPE="multipart/form-data" LANG="JA" ACCEPT-CHARSET="ISO-2022-JP,Shift_JIS,EUC-JP"></FORM>のようにENCTYPE="multipart/form-data"を指定する(HTML i18N 準拠)。
とすることが考えられます。 ただし、プロバイダ指定のCGIプログラムを用いる場合においては、実装に左右され、サーバがエラーを起こす(このサイトを置いているBekkoameとか(怒)!)などということがありますので、必ず動作を確認してから使用してください。
MS-I.E.が文字化けを起こしやすいことは上述したとおりですが、これに対する処方が報告されています。それは
改行コードをLFにする
というものです。これは「やってみたら、そうなった」という話なので、再現性のあるものかどうかはわかりません。HTMLの規格上は、改行コードはCR,LF,CRLFの3種類を使用できることになっており、CRLFとLFとで異なった動作をする理由はないはずです。つまり、これについての原因は不明です。MS-I.E.の文字化けに悩む人はお試しください。もし、これで見事に文字化けが直ったなら、ぜひこちらへお知らせください。
この件について、W3Cの村田真さんからメイルを頂きました。いろいろ納得できないこともあったので、いくつか質問などさせて頂いたところ、丁寧なお答えをいただきました。要約すると
などと書く。AddType "text/html; charset=iso-2022-jp" html
この情報をホームぺージ・クリエイターズ・フォーラムに流したところ、いくつか疑問な点も見つかったので、補足します。
とする。print "Content-type: text/html; charset=iso-2022-jp\n\n";
などと指定しておく。 参考1 参考2 なお、CERN-httpdではAddType "text/html; charset=Shift_JIS" html2
というように順序が逆で、パラメタ文字列に空白を挟んではならない。AddType .html2 text/html;charset=iso8859-2 8bit
いやあ、なかなか難しいですね。しかしこれをやらないと、日本語で書いたHTML文書は読めなくなってしまうかもしれません。
というわけで、賛同される方は以下の提案を宣伝なさってください。見返りはまったくありませんが。
と書いて置きましょう。AddType "text/html; charset=iso-2022-jp" html