oやaの上に~を表示させる方法(長いです。)

前にもどる

コンピュータやネットのなかでの文字の扱い

HTMLでの文字の扱い

aの上の~はどうなってるか?

フォントとの関係

HTMLのまとめ

ところが!

具体的にどうするか

最後に

感謝

コンピュータやネットのなかでの文字の扱い

 まず、コンピュータのなかで文字はどうなっているのかを考えてみましょう。

文字(キーボードから日本語インプットメソッドを通して漢字に)

     どの文字をどの数字に対応するかの対応表で変換

数字のデータ("0"と"1"の組み合わせの数字。コンピュータだからこの形でないと入らない)

     どの数字がどの文字に対応するかの対応表

文字(ディスプレイなどに表示)

 という風に表示されています。問題はこの中の文字と数字の対応表です。歴史的にはまず、コンピューターの開発されたUSAで使われている英語のアルファベットを表示するための"ASCII"とよばれる対応表ができて、日本ではそれを参考に(足かせに)"JIS"、"Shift JIS"、"EUC"といった対応表ができました。"ASCII"の方も英語以外のアルファベットの上にいろんなものが載っている言葉(ポルトガル語とかフランス語とか)も対応表に入れた"Latin-1"("ISO-8859-1"ともいう)というのができました。現在、世界中の言葉を全部含もうとするISO10646(ほとんど"UNICODE"と同じ)という対応表が作られ、また、文字が付け加えられ続けています。

 例えば、「繭」という字は

 Shift JISという対応表では16進数で"969A"、2進数では1001011010011010に変換され、JISという対応表ではあらかじめ1983年に制定された漢字の表であるという宣言(16進数で"1B2442"、2進数で000110110010010001000010)を事前にする事を前提に、16進数で"4B7A"、2進数で0100101101111010に変換されます。

 内部にShift JISという対応表を持つコンピューターの中にはこの対応表で変換された数字でため込まれることになります。 (UnixはEUCという表です。Shift JISはNECの9801のMS-DOSなどで使われ、今でも広く使われています。MacOSやWindows98は...あとでまた。)

 対応表が同じでないと違う字になってしまうか、そんな数字に割当たる字はないということで表示されないか、あるいはへんな変換をされてアルファベットや記号の羅列になります。

 このようなコンピューター内部の文字から数字への変換はインターネットなどのTCP/IPのネット内ではどう扱われるでしょうか?

 まず、ホームページを作ってIPS(プロバイダー)のサーバーにアップするときを考えると

文字入力

    (例えばShift JISで変換。これは使っているOSの都合やページ作りソフトの仕様による。)

コンピューターの内部の数字のデータ

    (インターネットを経由。実はここでは、伝送の都合でいろいろ変換はするけど、字と数字の対応は変えてない。)

IPSのサーバ

ということになります。

 でもって、これを誰かが見ようとするときは...

IPSサーバの中の数字の羅列(一見、訳の分からん"0"、"1"の並び)

    (インターネット経由。いろいろやるけど、数字はもどせるようにすることになっている)

自分のコンピュータの中へ数字の列が来る。

    (OSとその上のブラウザが数字を文字に変換)

画面で読める文字の形になるので読める。

となります。ここで問題になるのは、ブラウザが数字を文字に変換するところです。

HTMLでの文字の扱い

 ブラウザーが数字を文字に変換するときにブラウザーが困ること、それは「もとはどういう対応表なんだ?対応表によって表示する字が違うぞ!!」ということです。

 では、ブラウザはどうやって、もとの数字の羅列の文字への対応表を知ることができるんでしょう。HTML/4.01では、HTMLを持っているHTTPサーバがブラウザに知らせることになっています。その方法は...

(1)HTTPのヘッダに書いて知らせる。

 ここのヘッダというのはHTMLのソースの<HEAD>タグの中身ということではなくて、そのソースを送る前に、ブラウザで見えない形でサーバがHTTPプロトコル(HTTP/1.1 RFC2616)に従って送っているヘッダのことです。では、サーバはこのHTMLソースがどの変換表を使って書かれているのかを知るのでしょうか?数字の羅列の中から規則を見つけて、これはこの変換表を使っているはず!と予想して決め、(これでいいのかな?という感じだけど、そうらしい)でも、わからないときはへたに間違ったものを送るより、送らない方がいい、ということで、このヘッダには何も書かないで送るサーバもあるそうです。

 でも、HTMLソースでサーバにこの符号化を使ってね!と知らせる方法があります。それがHTMLのソースの<HEAD>のところに<META>タグを使って書く方法です。つまり

<META http-equiv="Content-Type" content="text/html; charset=Shift JIS">

ってやつです。このcharsetというのが対応表の指示で、サーバによっては自分で無理しないでここをよんで、なるほど、Shift JISねと認識するものもあるそうです。また、ヘッダで送る自信がないサーバが、何も送ってこなくても、クライアントのブラウザがこのタグを読むことにより、どの対応表を使っているかわかるし、そうすべきだと規格も決めています。つまり、

(2)サーバがいわなかったらHTMLのソースの<HEAD>のところに<META>タグを使って書いてあればブラウザはそれに従う。

そして、それもなかったら、

(3)ブラウザが、あちこち探して、どんな対応表を使っているか推測する。ヘッダやソースのどこかにヒントが隠されていることがある。

 これがサーバからの指示ですけど、そういうものが全くないときは、ブラウザ側が決めるしかありません。その方法は、長年の経験を使う、(?!)あるいは使っている人にやらせるという方法です。つまりサーバのやっているように数字の羅列の規則を見つけるとか、文字化けして変になっている画面をとりあえず出して、見ている人にメニューから自分で選んでよ!とそれとなく強制する方法です。あるいは、設定メニューをいじんなければ出ないこともありますよね。(たまにあるのは、フォントがWindowsにしかないものが指定してあって、MacOSのネスケ4.5で表示できないこと。このときは設定メニューでフォントを強制指示しなければならない。)

 というわけで、ソースを書く人ができるのは

<META http-equiv="Content-Type" content="text/html; charset=Shift JIS">

を書くことでしょうか。それも、ヘッドの一番最初に。このページのソースも見ていただくとわかるようにこのShift JISということにしてあります。

aの上の~はどうなってるか?

 ところがShift JISの対応表にはaの上に~という字やeの上に'などの字は載っていません。だから、この対応表では元々表示できないのです。でも、表示したい〜〜!というときどうしましょう?HTML/4.01では、その方法もちゃんと用意してくれています。「文字参照」というのを使う方法です。

 「文字参照」とは、「&」と「;」の間に数字(10進数か16進数で表示する。数値文字参照)やアルファベットの羅列(文字実体参照)を書いて文字を指示する方法です。例えば、aの上に~は&#227;(10進数の数値文字参照)、&#xHE3;(16進数の数値文字参照)、&atilde;(文字実体参照)のどれかを書けば、ブラウザは、文字符号化方法がなんであっても関係なく、その文字を表示できるようにしてほしいとHTML/4.01は求めています。どの文字がどの数字になっているか?これこそ文字と数字の対応表ですね!HTML/4.01にはこの対応表にISO10646を使えと書いてあります。Unicodeとほとんど同じ表です。Unicodeは日々世界の文字が増えているそうなので、世界中の文字がこれで表示できるはずです。また、「atilde」というのは、数字で表すよりももっと実感的でわかりやすいようにと、HTMLで決めた表にある名称です。そのような名称がどの文字に、また、どのISO10646の表の中の数字に対応しているかを決めた表はHTML/4.01ではhttp://www.w3.org/TR/1999/REC-html401-19991224/sgml/entities.htmlにあります。しかし、OSの方にフォントがないとかで表示できないこともありますね。そのときは表示できないことをなんかわかるようにしてね!というふうにいっています。あるいは16進数の数字をそのまま出す方法でもいいよといっています。

フォントとの関係

 MacOSに載っているosakaやWindows95以降のMS ゴシックなどの日本語フォントはShift JISに従っていて、aの上に~という文字は用意されていません。だから上の章のフォントがなくて表示できない例に当たります。しかし、Timesなどのフォントであればこの文字は用意されています。これらのフォントはLatin-1に従っていて、この対応表にはaの上に~だとか、eの上に'などの文字が含まれているからです。そこで、この文字が出てくる部分に、このLatin-1に従っているフォントを使えば、表示できるはず(表示できてほしい)です。ただし、もともとi-Modeは使えるフォントが一つしかないから、この方法でも表示できません。

HTMLのまとめ

 HTML/4.01に対応しているブラウザで、aの上に~を出す方法をまとめると


1.他の部分が日本語を使っているのでそれを出すためにOSが使っている符号化方法(Shift JISなど)をMETAタグで明示。

2.Shift JISにはaの上に~はないので、文字参照を使って、ブラウザに認識させる。

3.aの上に~を表示できるフォントをスタイルシート(など)で指示する。


 となります。これで、HTML/4.01に対応を標榜しているブラウザは表示してくれるはずです。Macではインターネットエクスプローラー4以上はこの方法で表示できます。

ところが!

 HTML/4.01に対応しているはずのネットスケープナビゲーター4.7はこの方法で表示できないんです!ファンなんだけど、これには困ったもんです。ただ、マッキントッシュ上のネットスケープでは方法はあります。前には慣例的に使われていた方法なんですけど、正式なHTML規格では認められていない方法ですが。

 それは、フォント切り替えで、符号化方法を変えてしまうというものです。つまり、日本語(漢字)のフォントの時はShift JISを使い、欧文アルファベットのフォントの時はいきなり符号化方法を変えてLatin-1にする方法です。逆にいうと、どのフォントを使うかで符号化を切り替えるという方法です。具体的にいうと"osaka"の時はShift JISの変換表を使い、"times"の時はLatin-1の変換表を使うということ。これは実はMacOSで使われている方法です。Macに日本語を表示させようとしたときに、フォントが切り替わればいいという考えが出たわけですね。MacOS X(テン)ではこの方法はやめて、UNICODEを使うとアップル社は表明しています。つまり、日本語フォントでも用意していてさえしてくれれば、aに~も表示できる様になるはずです。(Windowsの方ではどうなっていますか?知っているかたがいたら、教えて下さい。)

具体的にどうするか

 まず、MacOSを用意します。

 テキストエディタを開き、フォントをLatin-1変換表を使っているものにします。(Times、Georgiaなど)

 必要なポルトガル語を書き込みます。フォントがLatin-1ならaに~は表示できるはずです。打ち込み方がわからない人は、調べてみて下さい。

 というのもなんなので方法を以下に書きます。

 アップルメニューからキー配列を選んで出して、フォントメニューから使っているフォントを選びます。キーボードのキーを押すとその押したところが灰色になり、空欄に打ち込んだ文字が表示されるのがわかるでしょう。

 メニューバー右の「ことえり」など、インプットメソッドのアイコンをアメリカ国旗マーク(USA入力)にします。~つき文字はダブルアクションで表示できます。ダブルアクションのやり方ですが、まず、optionキーを押すと、キー配列のキーの絵が変わって、灰色の四角に囲まれたキーが表示されます。これがダブルアクションキーです。~は"n"キーの位置にあるはずです。"option"キーを押しながら"n"キーを押し(これだけでは何も表示されません)、その後、普通に"a"キーを押すと、あら不思議aの上に~がついた字が出てきます。これはUSA配列のキーボードを模しているからこうなりますが、インプットメソッドのメニューからカスタマイズメニュー...を選んで、キーボードダイアログを出して、Brazilianにチェックをつけるとブラジル国旗を表示できるようになるので、そうすると、キーボードがブラジルで使われているものになってくれます。ブラジルキーボードでは最初から"["キーと":"キーに灰色四角キーがあります。つまり、"option"キーを使わずにダブルアクションのみで入力できるようになっているのです。cの下にチョロンが着く字は、最初から";"キーに割り当たっています。キートップにシールでも貼れば、ブラジルキーボードの練習までできますよ。

 とにかくこうやって入力してから、HTMLソースを作っている(つまりフォントは日本語用のフォントになっているはずです。)テキストエディターにコピー&ペーストします。そうすると、Latin-1で使っている数字でShift JISで使っている文字に重なっている場合はそれに変わってしまうし、文字がないときは長四角や文字化け(次の文字の上8ビット分との合わせで決まる漢字)になってしまいますが、これでは、普通はだめなんだけど、スタイルシートの方でこの部分のフォントをLatin-1フォントにしてしまうと、ネットスケープだと勝手にLatin-1の変換表に変えてくれて、入力したときの文字化けしていない文字に表示し直してくれるのです。(インターネットエクスプローラーでは文字化けのままです。)


 これはHTML/4.01基準にあっていません。

 HTMLでは、ブラウザのなかでは、自分が認識できる変換表の文字をISO10646(Unicode)の変換表の文字に置き換えることになっているので、文字化けした文字を受け取った時点でそれをShift JISから、ISO10646(Unicode)に置き換え、その後は、変換しないということだから、Latin-1変換表が出てくる幕はないので、これはできないはずなのです。

 ということで、この方法でaに~を表示しているページはHTML/4.01に合致しておらず、DOCTYPEという最初の宣言も嘘ということになるんですけど、他に表示する方法がないので、使わせてもらってます。だからこの方法で表示しているページだけは大嘘ページということになってしまいますね。

最後に

 ネットスケープも次のバージョンからはちゃんとW3Cの規格に合致したものにしてほしいですね。ぼやぼやしているうちにXMLという規格ができてしまったし。



文中の注

対応表

 対応表というのはわかりやすいかなーと思ってこの文章のなかで勝手に使っているいい方です。正式には文字符号化といういい方ですね。

以下の感謝のところにこの文字符号化について参考になるサイトを上げておきました。

Shift JIS

 実際のページでは「x-sjisと書け」といわれるし、多くのページ製作ソフトは勝手にこう書いてきます。しかし、HTML/4.01が使っていいといっている変換表の一覧(IANAというところが一覧を用意している。)にはこの表現はありません。あくまでもShift JISです。でもなぜ、x-sjisを使うのでしょうか?昔のブラウザで、Shift JISという表現がわからないものがあるかららしいです。それで、それをまだ使っているかもしれないし、しょうがないから、わかる方に合わせようということからであるということらしいです。

ブラウザ

 具体的にはネットスケープ・ナビゲーターやインターネット・エクスプローラーのことです。ここではわかりやすいようによく使われている「ブラウザ」という表現を使っていますが、正式にはユーザ・エージェントというと定義されています。ブラウザだけではなく、視覚障害の方用のHTML読み上げソフトなども考えているからでしょう。

伝送の都合でいろいろ変換

 HTTPは8bitコードを使うとRFCで決めています。しかし、ネットで文字を送るときは昔からの都合で8bitの内の1bitは気にしないで7bitで送るという慣習があります。それには、英語のアルファベットを表すには7bitで十分だったからという背景があります。だから、8bitから7bitを引いた残りの1bitはぞんざいな扱いをされる可能性があるのです。サーバによっては勝手に切ってしまうというひどいのもあるそうです。それで、文字が主体のメールシステム(SMPTプロトコルなど)では、画像でも何でも送れるようにするために8bitを7bitに変換するというMIMEという方法が考えられました。日本語もこのMIMEを使わせてもらって、どの変換表を使うかを宣言してからその変換表で変換した数字を更に7bitに変換して送っています。あるいは、7bitしか使わないことを前提に作られたJISを使っています。一方、HTTPプロトコルは8bitだと宣言した以上、7bitしか流してくれないサーバへの対抗策を作らなければなりません。それで、MIMEで使われている方法など、変換方法をいくつか列挙しており、どの方法を使ったかヘッダで宣言するようにといっています。

 メールはJISで(Shift JISは使うな)と昔はよくいわれましたが、HTTPでShift JISを使っていいのはこういう方法を使っているからです。今後はISO10646(UNICODE)をつかうOSやページ作りソフトも増えるはずなので、日本語など8bit×2で表す対応表がある文字だけが7bit問題に悩むということはなくなる(はずですけど)でしょう。

感謝

 このページを作るのに当たって、あちこちネットを調べました。このようなリソースを用意していただけた方々に感謝いたします。

HTML/4.01正式仕様書

HTMLは現在World Wide Web Consortiumという国際学術研究開発組織で標準化を行っているそうです。建前では、この仕様書に従って、ブラウザや、ページ作成ソフトを作ってくれということなんですが...今は、もっと新しい規格XML/1.0になっているそうです。でも、他のブラウザなどの対応はどうなんでしょうか?

HTML 4仕様書邦訳計画

内田明さんが「趣味で始めた」HTML 4の日本語訳ですが、今は、HTML/4.01に対応しています。多くの人が関わり、大変な労作で、非常に参考になりました。ありがたいことです。

HTTP/1.1仕様(RFC2616)

 RFCはインターネット上のいろいろな取り決めを決めている文章だそうです。その中の2616にHTTPというハイパーテキストマークアップ文書のネット上でのやりとり(プロトコル)について決めた文書があります。RFCはいろんなサーバーに置いてあるようですが、Internet FAQ Consortiumというのを見つけました。(ここは有名なんですか?)

よっち@ホームのRFCのページ

 RFCについて、日本語でいろいろわかるページです。日本語訳や訳へのリンクが充実しています。これらも、すべて、見返りなく訳されているそうで、頭が下がります。(ただしRFC2616の訳はないです。下の、文字符号化についての文章が参考になりました。)

The Web KANZAKI

 ネットの上での日本語の扱いを調べるのに非常に参考になりました。特に「日本語、半角、Shift JIS」のページや、「日本語と文字コード」のページは、非常に参考になりました。ありがとうございます。

XML Japanese Profile

 XMLで日本語の扱いをどう考えるか、検討用の文書だそうです。JIS TR X 0015の英語訳のようです。Shift JISと各種x-sjisの文字種の違いなどが整理されています。

Section 17 : 自動リロード・文字コード − <META>

 Academic HTMLの中のMETAタグの説明のところにx-sjisの話がちょっと出ています。このAcademic HTMLについては全然わかっていないのですが、Yahooで探してたら引っかかりました。学生のためのHTML講座のようですね。HTML4.01にも準拠しており、CSSもちゃんと分離していて、いい講座だと思います(無料みたいだし)。本も出ているようです。

前にもどる