[1] 文字のレンダリングにおけるグリフの選択 (決定) にはいろいろな情報が影響しており、 いろいろな処理があります。
の2つの段階に分けられますが、両者は完全に分離できるものではなく、 選ばれたフォントに必要なグリフがなければ次のフォントを探すという走査が必要となります。
[34] 単一のフォントであらゆる文字列を適切にレンダリングすることはできないため、 文字のレンダリングを行う実装は複数のフォントからのグリフの混合に対応する必要があります。
[13]
フォントの選択は、 font-family や <font face>
やその他の応用依存のフォント指定の方法で著者によって指定されたフォント名、
利用者スタイルシートや設定画面などで利用者によって指定されたフォント名、
利用者エージェントスタイルシートなどで利用者エージェントによって指定されたフォント名や、
その他の条件に基づき適切なフォントを選択する操作です。
URL で指定したフォントやプラットフォームの準備するフォントから選ばれますが、
fetch 待ちやエラーなども考慮が必要になります。
[33] プラットフォームは、
Web互換性のため、
具体的なフォント名で指定されるものとして
Web で歴史的によく使われてきたものを具備する必要があります。
当該フォントが自由ソフトウェアでない場合、
自由ソフトウェアである同等のフォントを具備し、
当該フォント名で選択されるべきです。
[39] 20世紀の Webサイトの表示には世界的に Comic Sans MS
と同等の雰囲気を持つ自由ソフトウェアなフォントが必要です。
[35] Web 以外 (たとえば RTF) も同様に互換性のために必要なフォントの集合があります。
[41]
プラットフォームは、
Webサイトで利用されてきたフォント依存符号化のフォントを具備する必要があります。
[43] Web 以外 (たとえば RTF) も同様に互換性のために必要なフォント依存符号化のフォントの集合があります。
[105]
プラットフォームは、 Webサイトや Web 以外で利用されてきた主要な外字フォントを具備する必要があります。
[106] フォント依存符号化のフォントや外字フォントは、 文字の同定に根本的に関わる重要なフォントです。 プラットフォームが当該フォントまたは代替フォントを提供できない場合、 他のフォントや標準的な Unicode の符号位置への写像表などの情報を用いて、 適切な表示ができるようにエミュレートする必要があります。
[30] 同じとされる文字でも言語によって違った形で使われていることがあります。 従って文字のレンダリングの過程には言語情報によるフォント選択、 言語情報によるグリフ選択が必要となります。 また、文字列には言語情報が必要となります。
[42] 著者がフォントを指定する場合は、 言語に沿った適切なフォントの選択は著者の責任となります。
[36] 汎化されたフォント名が指定された場合や、 指定されたどのフォント名のフォントにも適切なグリフがない場合のフォントの選択は、 当該文字列に必要なグリフの有無は当然のこと、 言語情報をも考慮する必要があります。
[51]
複数の言語に対応するフォントの場合は、
対応言語に沿った適切な表示のためのフォントの情報を整えるのはフォント開発者の責任となります。
[31] 言語によって変化するのは主としてグリフの選択 (によって選ばれるグリフ) ですが、それだけに留まりません。グリフと連動してメトリクスも変化させる必要が出てくることが多いですし、 合字化の有無、 縦書き表示と横書き表示でグリフを変化させるか否か、 傍線、傍点、ルビの位置、 その他周辺の諸事項にも言語情報の影響が及びます。
[46]
言語情報が CJK のとき、 monospace は半角と全角の慣習に沿ったフォントであることが期待されます。
[47] 言語情報が CJK 以外のとき、 ラテン文字、ギリシャ文字、キリル文字は全角のフォントでないことが期待されます。
[48] 現代の多くのデータ形式等は言語情報を指定できます。 実際に言語が指定されたデータが多く存在します。その場合はこれをそのまま利用できます。
[50]
しかし言語情報を伴わない場合や誤っている場合も多いのが実情です。
[27]
歴史的には
ISO/IEC 2022 図形文字集合、
TRONコードの面、
OEMコードページ、
Windowsコードページ、
ESC:、
IANA charset
といったものが言語に応じたグリフの選択に活用されていました。
[54] Unicode 以前の文字コードで作られたデータを表示するときは、 明示的な言語情報が欠けている場合も多いので、 これらの情報を言語のヒントとして活用するべきです。
[55] 明示的な言語情報もヒントも存在しない (または信用できない) ときは、 表示される文字列から自然言語処理の手法による言語判定を行うこともできます。
[59] 当記事では補正済み言語情報を本項の諸戦略によって決めた言語タグまたは空文字列とします。
[69] DOM の文書文書に於いては次のような実装戦略が期待されます。
null に設定します。null でない場合、@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;
}[60] 表示対象の文字列から補正済み言語情報を決めかねるときは、 利用者の環境 (ロケール, 言語の設定) に従うのが適切と考えられます。
[61] 当記事では利用者の言語情報を利用者の言語である1個以上の言語タグとします。
[81]
現在の多くの HTML文書は言語情報の指定がありますが、古い文書はそれが欠けている場合も多いです。
また、テキストファイルにも Content-Language:
ヘッダーで言語情報を指定できますが、それが欠けている場合が多いです。
[82]
しかし言語情報が欠けていると正しく表示できない言語も多いです。
漢字のように平均的な読者の文字の弁別に支障が出るほどの字形差が生じる場合もあります。
[83] そこでそうした文書もできるだけ適切に表示されるような情報を補うことが期待されます。 ところがこうした処理は、要件が不明瞭で発見的な方法で対処されるに過ぎず、 各種の仕様書で明確に規定されない空白域になっています。
[84] 文書に含まれる文字列から言語判定を行うという方法もありますが、 できれば再描画せずに表示開始前に決めてしまいたいところです。
[85] このような場面で利用できる情報に文字コードと TLD があります。 どちらも文字列からの言語判定よりも非常に簡単に推定できます。
[86] 古い文書は Unicode 以前の文字コードを使っている場合が多く、 言語を推定する好材料です。
[88]
それに比べると信頼性が落ちますが、 TLD も便利な情報です。
TLD は文字コードの判定にも補助的に使われていますが、
言語の判定にも同じ理由で使えます。
[100] 文書の文字符号化から言語への対応付けは、 次によります。記載のない符号化は、対応なしとします。
[93] 文書の番地の TLD から言語への対応付けは、 次によります。記載のないTLDや TLD のない URL は、対応なしとします。
[102] 文書の文字符号化と文書の番地の TLD から言語への対応付けは、 次によります。記載のない文字符号化や記載のない TLDや TLD のない URL は、対応なしとします。
[107] TLD 以外の部分も使うべき場合もあります。例えば Twitter は独自の絵文字を PUA に割り当てていますが、 現在の Twitter の WebサイトはWebフォントを指定していませんから、 環境によって正しく表示されたりされなかったりします。 にも関わらず多くの人が当該絵文字を利用し続けています。
[108]
twitter.com や x.com
およびそのサブドメインの PUA のフォントの選択では、
当該外字をエミュレートするような互換フォントを利用するべきです。
[45]
フォントの対応する言語の判定は、基本的には当該フォントの申告に基づきます。
[56]
\
の字形などフォント自体に情報がない事項は、
応用がフォント名の表を保持するなどして個別に対応する必要があります。
[87] Intent to ship: Changing default Japanese fonts to modern fonts - Google グループ () https://groups.google.com/forum/#!topic/mozilla.dev.platform/DZ4QgKAWEnY
[57] 後方互換性のため、
\ の字形は日本語のとき ¥、
韓国語のとき ₩
とすることを原則とする必要があります。
ただし最近の日本語や韓国語のフォントの中には
\
のままとすることもあるので、細かな制御が必要となります。
[62] 推奨される実装戦略: フォント名が明示されないままフォントを選ぶ場合において、
[53]
互換性のため、ルーマニア語の正しい字形の表示のためにはルーマニア語に対応したグリフを標準とするか、
locl によって切り替え可能なフォントを選択する必要があります。
[89] 推奨される実装戦略: フォント名が明示されないままフォントを選ぶ場合において、
[104] TLD が .mn のときは、
キリル文字の文字コードを蒙古の国内規格に読み替える必要があります。
[94]
似た形の文字が Unicode で同じ符号位置にまとめられており、
言語や国によって慣習的に適切な字形が著しく異なることがあります。
時には文字の弁別に関わる場合があり、適切なフォントを選択することは非常に重要です。
[95] それほど深刻な違いでなくても、地域や言語の慣習で細かい字形の設計や配置の傾向に差がある事例は非常に多いです。 特にラテン文字などは世界的に使われるため、地域による好みの違いが多いです。
[96] このうち >>95 に分類できるものは美しさに関係する問題といえるので、 言語情報やフォントの指定が適切に行われているときにさえ適切にフォントの選択とグリフの選択が行われるなら、 それが不十分なときに最適でなくてもやむを得ないと妥協できます。
[97] >>94 は可読性に影響する本質的問題なので、 古い文書など何らかの理由で言語情報やフォントの指定が適切に行われていないとしても、 可能な限りそれらを推測して適切な表示を目指すべきです。 具体的には、 補正済み言語情報を使ったフォントの選択や、 言語の情報が適切に付与されていないフォントの選択肢からの除外などです。
[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 が出現したところで打ち切って他のフォントを探したりしません。)
[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