利用者の言語情報

フォントとグリフの選択

[1] 文字のレンダリングにおけるグリフの選択 (決定) にはいろいろな情報が影響しており、 いろいろな処理があります。

仕様書

フォントの選択とグリフの選択

[10] 文字のレンダリングのためのグリフの選択は、

の2つの段階に分けられますが、両者は完全に分離できるものではなく、 選ばれたフォントに必要なグリフがなければ次のフォントを探すという走査が必要となります。

[34] 単一のフォントであらゆる文字列を適切にレンダリングすることはできないため、 文字のレンダリングを行う実装は複数のフォントからのグリフの混合に対応する必要があります。

[13] フォントの選択は、 font-family<font face> やその他の応用依存のフォント指定の方法で著者によって指定されたフォント名利用者スタイルシートや設定画面などで利用者によって指定されたフォント名利用者エージェントスタイルシートなどで利用者エージェントによって指定されたフォント名や、 その他の条件に基づき適切なフォントを選択する操作です。 URL で指定したフォントプラットフォームの準備するフォントから選ばれますが、 fetch 待ちやエラーなども考慮が必要になります。

フォントを選ぶ

[14] フォントは、その出所が何種類かあります。

[21] フォント名は、その解釈が何種類かあります。


[33] プラットフォームは、 Web互換性のため、 具体的なフォント名で指定されるものとして Web で歴史的によく使われてきたものを具備する必要があります。 当該フォント自由ソフトウェアでない場合、 自由ソフトウェアである同等のフォントを具備し、 当該フォント名で選択されるべきです。 フォント名のWeb互換性

[38] 指定されたフォント自由ソフトウェアでない場合、 想定された表示と完全に同じにすることは不可能ですが、 文字幅や表示上の雰囲気が著しく異ならない代替フォントを利用することが望まれます。

[39] 20世紀Webサイトの表示には世界的に Comic Sans MS と同等の雰囲気を持つ自由ソフトウェアフォントが必要です。 Comic Sans MS

[37] 平成時代日本Webサイトとの互換性のため、 MS Pゴシックと同等の機能性を持つ自由ソフトウェアフォントが必要です。 AA

[35] Web 以外 (たとえば RTF) も同様に互換性のために必要なフォント集合があります。

[40] 指定されたフォント名の一覧にそれ自体が installed font であるものと互換フォントだけが installed font であるものが混在するとき、 一覧中の優先順位を調整する必要があるかもしれません。

[41] プラットフォームは、 Webサイトで利用されてきたフォント依存符号化フォントを具備する必要があります。 フォント依存符号化

[43] Web 以外 (たとえば RTF) も同様に互換性のために必要なフォント依存符号化フォント集合があります。

[105] プラットフォームは、 WebサイトWeb 以外で利用されてきた主要な外字フォントを具備する必要があります。 外字, フォント依存符号化

[106] フォント依存符号化フォント外字フォントは、 文字の同定に根本的に関わる重要なフォントです。 プラットフォームが当該フォントまたは代替フォントを提供できない場合、 他のフォントや標準的な Unicode符号位置への写像表などの情報を用いて、 適切な表示ができるようにエミュレートする必要があります。


[2] フォントの選択

グリフを選ぶ

[24] グリフの選択

言語情報による選択

[30] 同じとされる文字でも言語によって違った形で使われていることがあります。 従って文字のレンダリングの過程には言語情報によるフォント選択言語情報によるグリフ選択が必要となります。 また、文字列には言語情報が必要となります。

[42] 著者フォントを指定する場合は、 言語に沿った適切なフォントの選択著者の責任となります。

[36] 汎化されたフォント名が指定された場合や、 指定されたどのフォント名フォントにも適切なグリフがない場合のフォントの選択は、 当該文字列に必要なグリフの有無は当然のこと、 言語情報をも考慮する必要があります。

[44] 日本語文字列に含まれる漢字serif が指定されている場合は、 installed font のうち日本語に対応しているとされるフォントを選ぶ必要があります。

[51] 複数の言語に対応するフォントの場合は、 対応言語に沿った適切な表示のためのフォントの情報を整えるのはフォント開発者の責任となります。 OpenTypeにおける言語

[52] meta に適切な言語の情報を記述したり、 loclグリフの切り替え規則を記述したりする必要があります。

[19] 文字のレンダリング言語

[31] 言語によって変化するのは主としてグリフの選択 (によって選ばれるグリフ) ですが、それだけに留まりません。グリフと連動してメトリクスも変化させる必要が出てくることが多いですし、 合字化の有無、 縦書き表示と横書き表示でグリフを変化させるか否か、 傍線傍点ルビの位置、 その他周辺の諸事項にも言語情報の影響が及びます。

[46] 言語情報CJK のとき、 monospace半角全角の慣習に沿ったフォントであることが期待されます。

[47] 言語情報CJK 以外のとき、 ラテン文字ギリシャ文字キリル文字全角フォントないことが期待されます。

文字列の言語の識別

[20] 文字列には適切な表示のため言語情報が必要です。

[48] 現代の多くのデータ形式等は言語情報を指定できます。 実際に言語が指定されたデータが多く存在します。その場合はこれをそのまま利用できます。

[49] HTML には lang 属性があります。

[50] しかし言語情報を伴わない場合や誤っている場合も多いのが実情です。 言語タグ, 識別子文字

[27] 歴史的には ISO/IEC 2022 図形文字集合TRONコードの面、 OEMコードページWindowsコードページESC:IANA charset といったものが言語に応じたグリフの選択に活用されていました。 文字コードの変換

[54] Unicode 以前の文字コードで作られたデータを表示するときは、 明示的な言語情報が欠けている場合も多いので、 これらの情報を言語のヒントとして活用するべきです。

[55] 明示的な言語情報もヒントも存在しない (または信用できない) ときは、 表示される文字列から自然言語処理の手法による言語判定を行うこともできます。

[59] 当記事では補正済み言語情報を本項の諸戦略によって決めた言語タグまたは空文字列とします。

[69] DOM文書文書に於いては次のような実装戦略が期待されます。

  1. [70] 言語を、文書言語に設定します。
  2. [71] 言語空文字列の場合、
    1. [72] 言語を、 文書文字符号化文書番地から得た言語に設定します (あれば)。
    2. [73] 言語空文字列の場合、
      1. [101] 言語を、 文書文字符号化から得た言語に設定します (あれば)。
    3. [73] 言語空文字列の場合、
      1. [74] 言語を、 文書番地から得た言語に設定します (あれば)。
    4. [76] 言語空文字列ない場合、
      1. [77] 言語系を、 言語に相当する言語系タグに設定します。 なければ null に設定します。
      2. [78] 言語系nullない場合、
        1. [75] 文書に次のような presentational hint を適用します。
          @namespace html "http://www.w3.org/1999/xhtml";
          @namespace svg "http://www.w3.org/2000/svg";
          :root {
            font-language-override: "言語系";
          }
          [xml|lang], html|*[lang], svg|*[lang] {
            font-language-override: normal;
          }
  3. [79] 文書補正済み言語情報を、 言語に設定します。

[60] 表示対象の文字列から補正済み言語情報を決めかねるときは、 利用者の環境 (ロケール, 言語の設定) に従うのが適切と考えられます。

[61] 当記事では利用者の言語情報利用者の言語である1個以上の言語タグとします。

文字コードと TLD に基づく言語ヒント

[81] 現在の多くの HTML文書言語情報の指定がありますが、古い文書はそれが欠けている場合も多いです。 また、テキストファイルにも Content-Language: ヘッダー言語情報を指定できますが、それが欠けている場合が多いです。

[82] しかし言語情報が欠けていると正しく表示できない言語も多いです。 漢字のように平均的な読者の文字の弁別に支障が出るほどの字形差が生じる場合もあります。 中華フォント問題

[83] そこでそうした文書もできるだけ適切に表示されるような情報を補うことが期待されます。 ところがこうした処理は、要件が不明瞭で発見的な方法で対処されるに過ぎず、 各種の仕様書で明確に規定されない空白域になっています。

[84] 文書に含まれる文字列から言語判定を行うという方法もありますが、 できれば再描画せずに表示開始前に決めてしまいたいところです。

[85] このような場面で利用できる情報に文字コードTLD があります。 どちらも文字列からの言語判定よりも非常に簡単に推定できます。

[86] 古い文書は Unicode 以前の文字コードを使っている場合が多く、 言語を推定する好材料です。

[88] それに比べると信頼性が落ちますが、 TLD も便利な情報です。 TLD文字コードの判定にも補助的に使われていますが、 言語の判定にも同じ理由で使えます。 文字コードの判定, ロケール等による文字コード判定の補助

文字コード等に依存した特殊な表示処理


[100] 文書文字符号化から言語への対応付けは、 次によります。記載のない符号化は、対応なしとします。

e
符号化
t
言語タグ
o
言語系タグ
e
ISO-8859-6
t
ar
o
ARA
e
ISO-8859-7
t
el
o
ELL
e
windows-1253
t
el
o
ELL
e
ISO-8859-8
t
he
o
IWR
e
ISO-8859-8-I
t
he
o
IWR
e
windows-1255
t
he
o
IWR
e
KOI8-R
t
ru
o
RUS
e
KOI8-U
t
uk
o
UKR
e
x-MNS4329
t
mn
o
MNG
e
x-MNS4330
t
mn
o
MNG
e
x-MNS4331
t
mn
o
MNG
e
windows-874
t
th
o
THA
e
windows-1254
t
tr
o
TRK
e
windows-1258
t
vi
o
VIT
e
viscii
t
vi
o
VIT
e
x-viet-tcvn
t
vi
o
VIT
e
x-viet-vni
t
vi
o
VIT
e
x-viet-vps
t
vi
o
VIT
e
GBK
t
zh-CN
o
ZHS
e
gb18030
t
zh-CN
o
ZHS
e
HZ-GB-2312
t
zh-CN
o
ZHS
e
Big5
t
zh-Hant
e
Big5-UAO
t
zh-TW
o
ZHT
e
EUC-TW
t
zh-TW
o
ZHT
e
ISO-2022-CN
t
zh
e
EUC-JP
t
ja
o
JAN
e
Shift_JIS
t
ja
o
JAN
e
ISO-2022-JP
t
ja
o
JAN
e
junet
t
ja
o
JAN
e
x-docomo-shift_jis
t
ja
o
JAN
e
x-kddi-shift_jis
t
ja
o
JAN
e
x-softbank-shift_jis
t
ja
o
JAN
e
x-mac-japanese
t
ja
o
JAN
e
EUC-KR
t
ko-KR
o
KOR
e
georgian-academy
t
ka
o
KAT
e
georgian-ps
t
ka
o
KAT
e
tscii
t
ta
o
TAM
e
tab
t
ta
o
TAM
e
tam
t
ta
o
TAM

[93] 文書番地TLD から言語への対応付けは、 次によります。記載のないTLDTLD のない URL は、対応なしとします。

d
TLD
t
言語タグ
o
言語系タグ
d
.yu
t
sr
o
SRB
d
.rs
t
sr
o
SRB
d
.ba
t
sr
o
SRB
d
.mk
t
mk
o
MKD
d
.xn--d1alf
t
mk
o
MKD
d
.bg
t
bg
o
BGR
d
.xn--90ae
t
bg
o
BGR
d
.ru
t
ru
o
RUS
d
.xn--p1ai
t
ru
o
RUS
d
.su
t
ru
o
RUS
d
.ua
t
uk
o
UKR
d
.by
t
be
o
BEL
d
.xn--90ais
t
be
o
BEL
d
.kz
t
kk
o
KAZ
d
.xn--80ao21a
t
kk
o
KAZ
d
.kg
t
ky
o
KIR
d
.tj
t
tg
o
TAJ
d
.uz
t
uz
o
UZB
d
.tm
t
tk
o
TKM
d
.mn
t
mn
o
MNG
d
.gr
t
el
o
ELL
d
.tr
t
tr
o
TRK
d
.cn
t
zh-CN
o
ZHS
d
.xn--fiqs8S
t
zh-CN
o
ZHS
d
.xn--fiqz9S
t
zh-CN
o
ZHS
d
.hk
t
zh-HK
o
ZHH
d
.mo
t
zh-MO
o
ZHTM
d
.tw
t
zh-TW
o
ZHT
d
.xn--kprw13d
t
zh-TW
o
ZHT
d
.xn--kpry57d
t
zh-TW
o
ZHT
d
.jp
t
ja
o
JAN
d
.kr
t
ko-KR
o
KOR
d
.xn--3e0b707e
t
ko-KR
o
KOR
d
.ro
t
ro
o
ROM
d
.md
t
ro
o
ROM

[102] 文書文字符号化文書番地TLD から言語への対応付けは、 次によります。記載のない文字符号化や記載のない TLDTLD のない URL は、対応なしとします。

e
符号化
d
TLD
t
言語タグ
o
言語系タグ
d
.me
e
windows-1251
t
cnr
o
SRB
d
.md
e
windows-1251
t
ru
o
RUS
d
.am
e
windows-1251
t
ru
o
RUS
d
.ge
e
windows-1251
t
ru
o
RUS
d
.az
e
windows-1251
t
ru
o
RUS
d
.ee
e
windows-1251
t
ru
o
RUS
d
.lv
e
windows-1251
t
ru
o
RUS
d
.lt
e
windows-1251
t
ru
o
RUS
e
Big5
d
.hk
t
zh-HK
o
ZHT
e
Big5
d
.mo
t
zh-MO
o
ZHT
e
Big5
d
.my
t
zh-MY
o
ZHT
e
Big5
d
.sg
t
zh-SG
o
ZHT
e
Big5
d
.tw
t
zh-TW
o
ZHT
e
ISO-2022-CN
d
.cn
t
zh-CN
o
ZHS
e
ISO-2022-CN
d
.hk
t
zh-HK
o
ZHT
e
ISO-2022-CN
d
.mo
t
zh-MO
o
ZHT
e
ISO-2022-CN
d
.tw
t
zh-TW
o
ZHT
e
gb18030
d
.my
t
zh-MY
o
ZHS
e
gb18030
d
.xn--mgbx4cd0ab
t
zh-MY
o
ZHS
e
gb18030
d
.sg
t
zh-SG
o
ZHS
e
gb18030
d
.clchc0ea0b2g2a9gcd
t
zh-SG
o
ZHS
e
gb18030
d
.yfro4i67o
t
zh-SG
o
ZHS

[107] TLD 以外の部分も使うべき場合もあります。例えば Twitter は独自の絵文字PUA に割り当てていますが、 現在の TwitterWebサイトWebフォントを指定していませんから、 環境によって正しく表示されたりされなかったりします。 にも関わらず多くの人が当該絵文字を利用し続けています。

[108] twitter.comx.com およびそのサブドメインPUAフォントの選択では、 当該外字をエミュレートするような互換フォントを利用するべきです。

フォントの対応言語等の識別

[45] フォントの対応する言語の判定は、基本的には当該フォントの申告に基づきます。 OpenTypeにおける言語 しかし古く言語の情報が備わっていないフォントや、 誤った言語の情報が記載されたフォントなどの情報を応用が個別に対処する必要がある場合もあります。

[56] \字形などフォント自体に情報がない事項は、 応用フォント名の表を保持するなどして個別に対応する必要があります。

[87] Intent to ship: Changing default Japanese fonts to modern fonts - Google グループ () https://groups.google.com/forum/#!topic/mozilla.dev.platform/DZ4QgKAWEnY

円問題

[57] 後方互換性のため、 \字形日本語のとき ¥韓国語のとき とすることを原則とする必要があります。 ただし最近の日本語韓国語フォントの中には \ のままとすることもあるので、細かな制御が必要となります。 円問題

[58] 本来これは Shift_JIS の仕様であり、 EUC-JP では適用しないなど文書文字符号化に依存した細かな調整が求められるところです。 しかし長年 Windows が区別せず一緒くたに扱ってきたため、 Shift_JIS, EUC-JP, ISO-2022-JP, UTF-8文字コードの違いに実効性がなく、 かわりに和文フォントと欧文フォント等との違いとして扱うのが現在となっては妥当と考えられます。

[62] 推奨される実装戦略: フォント名が明示されないままフォントを選ぶ場合において、

  1. [80] 言語を、文書補正済み言語情報に設定します。
  2. [64] 言語日本語言語タグまたはアイヌ語言語タグのいずれかの場合、
    1. [65] installed font であって \YEN SIGN の字形ではないと知られているものがあれば、 これを除外します。
  3. [67] 言語韓国語言語タグのいずれかの場合、
    1. [66] installed font であって \WON SIGN の字形ではないと知られているものがあれば、 これを除外します。
[68] この結果利用可能なフォント集合が空にならないよう、 プラットフォームは適切なフォントを具備するべきです。 それでもなお空になる場合には、 他のフォント\字形を参照するときにかわりに ¥ を参照するような代替の措置を実装するべきです (が、それをわざわざ実装するよりフォントを用意する方が簡単でしょう)。

[63] Webブラウザーやその他の現在や過去の実装事例については円問題参照。

ルーマニア語文字問題

[53] 互換性のため、ルーマニア語の正しい字形の表示のためにはルーマニア語に対応したグリフを標準とするか、 locl によって切り替え可能なフォントを選択する必要があります。 ルーマニア語文字問題

[89] 推奨される実装戦略: フォント名が明示されないままフォントを選ぶ場合において、

  1. [80] 言語を、文書補正済み言語情報に設定します。
  2. [90] 言語言語タグro または mo の場合、 または文書文字符号化ISO-8859-2 または windows-1250 の場合、
    1. [91] installed font であってルーマニア語に対応していないと知られているものがあれば、 これを除外します。
  3. [109] 言語言語タグtr, az, tk, tt, ku の場合、
    1. [110] installed font であってルーマニア語だけ対応していると知られているものがあれば、 これを除外します。
[92] 言語に関する条件は、 他の言語と同じ通常の installed font の絞り込みの処理だけでも十分ですが、 欧州の諸言語を機械的に対応していると宣言しているだけのフォントを排除する機構があると便利です。
[111] 関係する文字ルーマニア語以外の ISO-8859-2Windows-1250 の対象言語では使われません。

蒙古文字

[104] TLD.mn のときは、 キリル文字の文字コード蒙古の国内規格に読み替える必要があります。 文字コードの判定

過剰統合問題

[94] 似た形の文字Unicode で同じ符号位置にまとめられており、 言語によって慣習的に適切な字形が著しく異なることがあります。 時には文字の弁別に関わる場合があり、適切なフォントを選択することは非常に重要です。 中華フォント問題, キリル文字, トルコ語アルファベット, アラビア文字

[95] それほど深刻な違いでなくても、地域や言語の慣習で細かい字形の設計や配置の傾向に差がある事例は非常に多いです。 特にラテン文字などは世界的に使われるため、地域による好みの違いが多いです。

[96] このうち >>95 に分類できるものは美しさに関係する問題といえるので、 言語情報フォントの指定が適切に行われているときにさえ適切にフォントの選択グリフの選択が行われるなら、 それが不十分なときに最適でなくてもやむを得ないと妥協できます。

[97] >>94 は可読性に影響する本質的問題なので、 古い文書など何らかの理由で言語情報フォントの指定が適切に行われていないとしても、 可能な限りそれらを推測して適切な表示を目指すべきです。 具体的には、 補正済み言語情報を使ったフォントの選択や、 言語の情報が適切に付与されていないフォントの選択肢からの除外などです。

[98] GBKテキストファイルを開くときは、 言語タグメタ情報がどこにもないとしても、 文字コードGBK であることを使って中華人民共和国式のグリフで表示するべきです。

[99] ギリシャドメイン名で提供されている古い HTML文書ギリシャ文字は、 言語情報が欠落していたとしても、 和文フォント全角の字形ではなく欧文書体の可変幅の字形で表示されるべきです。

[103] セルビア語キリル文字の表示はセルビア系の字形を持つフォントによらなければなりません。 セルビア文字のみのフォントlocl によって切り替えられるフォントが選択されるべきです。 ロシア系の字形しかないフォントは選択されるべきではありません。

メモ

[3] DSSSL, , http://www.y-adagio.com/public/standards/jis_dsssl/cls12.txt

(4) 特質glyph-subst-table:は,#f,グリフ代替表又はグリフ代替表のリストであって,特質glyph-idが指定するglyph-idに対して,その代替グリフを探索する対象を指定する。値がリストの場合,指定された順序で代替グリフが探す。初期値は,#fとする。

(5) 特質glyph-subst-method:は,#f,文字列又は文字列のリストとする。各文字列は,グリフ代替を行う方法を指定する公開識別子でなければならない。初期値は#fとする。

備考 これにより,文脈依存のグリフ代替及び複数のグリフを含むグリフ代替が可能になる。

(6) 特質glyph-reorder-method:は,#f,文字列又は文字列のリストとする。各文字列は,グリフの再順序付けの方法の公開識別子を指定する。初期値は,#fとする。

備考 これは,普通ヒンズースクリプトで使用する。

[4] 利用者:emk - GlyphWiki, https://glyphwiki.org/wiki/User:emk#i0

webブラウザーによっては、内蔵のUnicodeデータベースで未定義のコードポイントは、ページがCSSなどでフォント名を直接指定しない限り表示しないよう制限している。

[5] Chrome でも Firefox でも、複数の文字の列の途中が cmap になくてグリフID 0 を含む列になって、それが GSUB によって(一部)置き換えられるような場合に、その通りに動作します。 (グリフID 0 が出現したところで打ち切って他のフォントを探したりしません。)

[6] タグ文字の処理の項も参照。

[7] グループ-ノート:住基 - GlyphWiki, https://glyphwiki.org/wiki/Group-talk:%e4%bd%8f%e5%9f%ba

(2010年7月の情報)Fedoraではフォント管理にfontconfigを使っています。fontconfigがフォントを日本語用と認識するにはあるテーブルのグリフをすべて収録している必要があります。で、基本的にJIS X 0208:1990の部分集合でした。--kamichi 2012年6月9日(土) 16:00

[8] ja.orth « fc-lang - fontconfig - Font customization and configuration library (mirrored from https://gitlab.freedesktop.org/fontconfig/fontconfig), , https://cgit.freedesktop.org/fontconfig/tree/fc-lang/ja.orth

[112] 1951981 - Can't find monospace font for thai on Linux (was: Somehow a specific plaintext file or its view-source equivalent aren't monospace), https://bugzilla.mozilla.org/show_bug.cgi?id=1951981

[113] 1748636 - Resolve CSS generic font-families after script run itemization, https://bugzilla.mozilla.org/show_bug.cgi?id=1748636

[114] フォントを指定したら文字化けした!!, , https://www.shtml.jp/mojibake/font.html