言語コードと国コード

HTML 4.0(それ以前にRFC2070)で導入されたlang属性、hreflang属性、およびXMLのxml:lang属性[1]は、「言語コード」を指定することで、ドキュメントで使用している言語を明示し、ブラウザの表示に加えてサーチエンジンや音声合成にも役立つような情報を提供します。ここで用いられる「言語コード」はURLの指定などに使われる「国コード」とは異なるもので、日本語は「JA」になります。混乱しやすいので、注意が必要です。

言語コード

日本のように国家と言語が(ほぼ)1対1で対応しているとあまり意識しませんが、一つの国で複数の公用語を持っているところもあれば、多くの国で使われる言語もあります。このため、「国コード」とは別に130以上の「言語コード」がISO 639によって定義されています。

主要なものを挙げると:

主な言語コード
ar アラビア語 it イタリア語
de ドイツ語 ja 日本語
el ギリシャ語 ko 韓国語
en 英語 la ラテン語
eo エスペラント語 ms マレー語
es スペイン語 ru ロシア語
fr フランス語 zh 中国語

となります。 RFC 4646(RFC1766、RDF3066を上書き) では、これを用いて、MIMEヘッダなどで言語を指定する方法を定めており、HTML 4でもこの方法に準拠しています(厳密にはHTML4での参照規格はRFC1766)。ここではアルファベット2文字による主言語のほかに、ハイフン(-)でつないで方言のような副言語を指定する方法も定められています。例えば

などです。XHTML文書中で言語を指定する方法は:

(例)

<html xmlns="..." xml:lang="ja" lang="ja">
<meta http-equiv="Content-Language" content="ja" />
<p xml:lang="ko">

などがあります。

〔補足〕

RFC3066では、ISO-639の3文字言語コードも使うことになったので、2文字コードには定義されていなかったMasai語(mas)のような言語も指定できます。2文字コードと3文字コード両方が定義されている場合は2文字コードを使うことになっているので、大半は従来と同じ標記です。

RFC4646ではさらにISO-15924のスクリプト名、さらに異体(variant)を表すコードも加えた複雑な言語タグが構成できるようになっています。

〔以上補足〕

国コード

URLなどでお馴染みの国コードで、日本ならJP、韓国ならKRというものです。こちらはISO 3166によって定められており、230以上あります。いくつか例を挙げると:

主な国コード
ar Argentina it Italy
br Brazil jp Japan
cn China kr Korea South
de Germany la Laos
eg Egypt ms Montserrat
es Spain my Malaysia
fr France ru Russia

という具合で、同じarでも言語コード(アラビア語)と国コード(アルゼンチン)では全然違っていたりするので注意してください。なお、URLで使う場合、例外として

があることはよくご存知の通りです。

Charset ?

HTML 4.0の仕様書では、meta要素による情報定義の一つとして、charsetの指定が正式に取り入れられました。

(例) <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp" />

charsetとはいうものの、ここで指定するのは実際は「文字セット(character set)」ではなく「文字コード(character encoding)」です [2]。指定するコードの形式は RFC2045 の定めるところに従います。IANAに登録されているcharsetISO-8859-1, US-ASCII, ISO-2022-JP, Shift_JIS, EUC-JPなどがあります。

このあたりが正式に固まる前にこの文字セット情報を独自に実装していたブラウザ(Netscape 2.0など)は、シフトJISをx-sjis、EUCをx-eucというcharsetで示すようにしていました。

これはx-という接頭辞が示すように正式に登録された名称ではありませんが、以前は広く使われており、今でも x-sjis で文字コード情報を指定しているファイルはたくさん残っていると考えられます。逆に古いブラウザでは、正しいShift_JISを指定すると完全に文字化けするものもありました。

そのため、x-sjisはだめとは言い切れないところですが、少なくとも今後作成するファイルでは、正式な文字コード指定を使うべきでしょう。新しいブラウザでは、x-eucとしてもEUCを認識してくれなくなっているようです。

[1] lang属性とxml:lang属性

HTML4では要素の自然言語を示すためにlang属性が使われますが、XMLの仕様において

A special attribute named xml:lang may be inserted in documents to specify the language used in the contents and attribute values of any element in an XML document. In valid documents, this attribute, like any other, must be declared if it is used.

XML 1.0 (2nd ed.) 2.12 Language Identification

xml:lang属性の使用が求められたため、XHTML1.0では両方の属性を並記することとなりました。さらにXHTMLモジュールを使うXHTML1.1やXHTML Basicでは、lang属性は廃止され、xml:lang属性のみに統一されます。

[2] charset

この用語の混乱は、RFCで次のように説明されています。

NOTE: The term "character set" was originally to describe such straightforward schemes as US-ASCII and ISO-8859-1 which have a simple one-to-one mapping from single octets to single characters. Multi-octet coded character sets and switching techniques make the situation more complex. For example, some communities use the term "character encoding" for what MIME calls a "character set", while using the phrase "coded character set" to denote an abstract mapping from integers (not octets) to characters.

RFC 2045 Section 2-2