徒歩・徒然

<HTML>lang="ja" を書かなくしました


2002年11月7日(木)

何のことだか分からない方もいらっしゃるかと思います。
ので説明したいと思うんですが、HTMLのことを良く知らない人に向けてゼロから説明するのは ちょっと無理そうなので、そこの所は端折ります(僕自身、分かってないことの方が圧倒的に多いですし)。ですから、何の事を書いてるのか分からない方は最後まで分からないままと思います。そこは一つ ご勘弁ください。おそらく、分からなくても何の支障もありません。

それから、あくまで僕の勝手な振る舞いですので、他人に強制しようという物ではありませんし、そもそも根拠が、僕の「個人的感覚」にしか基づいてないので、薄っぺらで どうしようもありません。興味のある方に ちょっと読んでもらえれば ぐらいの価値しかない文章なので、そこの所も ご了承いただきたいと思います。


HTMLの記述には、最初の文書型宣言(あれば)のあとに <HTML> というタグが現れます。

この <HTML> は何者かと言うと、例えば、HTML 4.01 StrictDTD(文書型定義)を見てみると、HTML要素のコメントに document root element とあります(「最上位要素」と訳している方も居ます)。

仕様書には、HTML要素の箇所に次のように書いてあります。
HTML 4.01 Specification標準情報(TR) TR X 0033:2000) より>

After document type declaration, the remainder of an HTML document is contained by the HTML element.

(文書型宣言の後のHTML文書の残りは,HTML要素によって包含される。)

※注意
TR X 0033:2000 は HTML 4.0 の仕様書が元で、HTML 4.01 Specification と同等ではないようです。

つまり、文書全体は <HTML> ~ </HTML> で囲まれ、その外側には(文書型宣言を除き)どんな内容も書けないということです。文書を括って これは全部がHTMLだと言っているようなものかも知れません。

※ただ、HTML 4.01 においては、

<!ELEMENT HTML O O (%html.content;) >

となっていて、HTML要素は 開始タグ終了タグとも省略が可能です。何故だか良く分かりません(ISO/IEC 15445:2000 では、どちらも省略不可となりました)。

さて最近、このHTML要素の開始タグ中に lang="ja" という感じで、文書の中身の言語を示す属性を書き込む方が増えてきました。何を隠そう、このサイトにおける僕の書いたHTMLでもそうです。

これには ちゃんと出所がありまして、Web Content Accessibility Guidelinesウェブ内容アクセス指針) てヤツが原因です。

これは、冒頭に These guidelines explain how to make Web content accessible to people with disabilities.(「この指針で、障害のある人も ウェブの内容に接近(アクセス)できるようにする方法を説明しています。」) と書いてありますが、つまり、WWWで公開している文書は 人やユーザーエージェントを問わずにアクセスできるようにしましょう、それについては こんなことを守れば良い、という内容のものです。いくつか(1.0では14個)の Guidelines=指針 が示してあって、その指針に合わせるには どうしたら良いかという中身が Checkpoints の形で細々と述べてあります。

※私見ですが、ハッキリ言って この指針に示された事を全て実行するのは大変な仕事です。HTMLその他の仕様を正しく理解するのが大変なだけではありません。チェックポイントの中には極めて曖昧な基準でしか評価できない種類の物もあり、それを満たしている満たしていないで 果てしない議論が発生してしまう可能性も大いにあります。

見ていくと、Guideline 4. Clarify natural language usage(指針4. 自然言語の使用を明確に) という箇所があり、それについて以下のようなチェックポイントがあります。ここに、<HTML> に lang属性を指定する方法が例示までされているのです。

4.3 Identify the primary natural language of a document. [Priority 3]
For example, in HTML set the "lang" attribute on the HTML element. In XML, use "xml:lang". Server operators should configure servers to take advantage of HTTP content negotiation mechanisms ([RFC2068], section 14.13) so that clients can automatically retrieve documents of the preferred language.
4.3 文書の基本の自然言語を識別できるようにしておく。 [優先度3]
例えば、HTMLでHTML要素の"lang"属性を設定。XMLで "xml:lang"を使用する。サーバー管理者は、HTTP内容交渉機構(HTTP content negotiation mechanisms)([RFC2068], section 14.13)を優先するようにサーバーを設定する。そうすれば、クライアントは参照された言語の文書を自動的に受け取ります。

要は、「『この文書は、基本的には日本語を用いて書かれています』ってのをハッキリさせとけ」、ってことでしょうか。

ここで注意して頂きたいのは、<HTML lang="ja"> みたいに書くのは あくまで一例に過ぎないことと、このような指定は人間のためでなく あくまで機械(たいていの場合、ソフトウェアだと思われますが)のための物であることです。人間は、画面に映った(あるいは 音声として聞こえた)言葉によって、それが何語であるか判断します。HTMLのタグの内容なんか 普通 見ません。ですから早い話、機械に向けて情報をきちんと送りさえすれば 手段は どうだって良いわけです。

以前から <HTML lang="ja"> について、個人的には あまり積極的じゃありませんでした。何故かと言うと、HTML要素は文書全体を括るもので、その他の要素とは ちょっと違うように見えるからです。<HTML>lang="ja" としてしまうと、例えば <LINK> における rel="Made" なんかに抵抗を感じるんです。これは どう考えても英語だよなぁ と。もちろん、仕様上は HTML要素で lang属性を使うことは許されているし、アクセス指針に例示があることも分かっています。考え方として、そこでの言語指定が 個々の要素の属性値まで含むとかいうのは 間違いなのでしょう。第一、表示結果に大きな影響を及ぼすような類の話では 決して有り得ません。それでも なお、僕の個人的な感覚では、抵抗感が拭えませんでした。<TITLE><BODY> に個別に指定する方が 理に適っているんじゃなかろうかと思ったりもしました。

代替手段として考えられるのは、HTTPレスポンスヘッダーで Content-Language: を指定する方法です。実は、上に引用したチェックポイントの「サーバー管理者」云々のくだりは、このことを述べています(分かりにくいよ。だから仕様書とか嫌いなのさ)Another HTML-lint の いしのK16さんも、Content-Language: を指定する方法について言及なさっています。なるほど、これならスマートで、純粋に文書の内容についての指定をしているような気がします(すいません、この辺りは どうしても感覚的な話になってしまいます。つまり、その程度の内容しかない主張なので)。

その方法を使おうと思いましたが、さて しかし、どうやったらいいのか。
結論から言いますと、.htaccess のファイルに AddLanguage ja .html の一行を付け加えるだけで済みました。

.htaccessApache サーバーで個々のユーザーが使用できる便利な設定ファイルで、以前、

<META http-equiv="Content-Type" content="text/html; charset=ISO-2022-JP">

を書かなくした際にも いじったファイルでした。
その時は、AddType "text/html; charset=ISO-2022-JP" html を付け加えています。
(この辺の話は「charsetパラメタの勧め」をご参照ください)

当サイトのトップページが、どのようにHTTPで転送されているか、確認してみると こんな感じです
ヘッダーの部分は以下のようになっていました。

HTTP/1.1 200 OK
Date: Day, DD Mon YYYY HH:MM:SS GMT
Server: Apache/1.3.33 (Unix)
Last-Modified: Day, DD Mon YYYY HH:MM:SS GMT
ETag: "XXXxx-xXX-XxxXXXXx"
Accept-Ranges: bytes
Content-Length: XXXX
Connection: close
Content-Type: text/html; charset=iso-2022-jp
Content-Language: ja

これでいいんじゃないか。
というわけで、<HTML> から lang="ja" を無くしました。順次、他のページにも広げていく事になると思います。


11月前半のページへ戻る


home


written by tardy@k.email.ne.jp