字元和字體是什麼樣的關係?怎樣去設計一個字體?

開始的問題描述沒有表述清楚我想問的問題(請原諒我該死的表達),所以我修改了一下,希望會比第一次的效果好。。。

LaTeX中會使用到灰常多的字體,cmr10.ttf這個字體是其中的一個。本人對字體有非常濃厚的興趣(但是是小小小白,這不就遇到了令我困惑的問題,可能是很弱智的問題。。),本人將cmr10.ttf拿出來,然後寫了個小程序跑,就遇到了這樣的問題了。

現在有兩種字體,分別是cmr10.ttf以及字體DroidSans。

現在有一個字元,也就是「Ω」,十進位表示是937,html表示為#937,Unicode編碼為U+03A9,用cmr10.ttf渲染得到結果為圖(1),用DroidSans得到結果為圖(2)。

又有一個字元,十進位表示為173,HTML表示為#173,Unicode編碼為U+00AD,用cmr10.ttf渲染得到結果如圖(3),用DroidSans得到結果為圖(4)。

現在的問題是,用兩種字體(cmr10.ttf和DroidSans)渲染同一個字元(U+00AD)為什麼得到的結果不一樣呢?

圖(1)

圖(2)

圖(3)

圖(4)


  • 字體是用來顯示字元的,將不可見的內存中的字元顯示為可見的圖形。

  • 日常使用的字元是由特定字符集(比如 Unicode)定義的。

  • 並非所有字體都遵循你用的字符集。

  • 我們不用十進位表示 Unicode 字元。你用「937」指代的那個字元「Ω」,正確的記寫格式為十六進位的「U+03A9」(這個字元的正式名稱為「GREEK CAPITAL LETTER OMEGA」)。而所謂的「173」應當記作「U+00AD」(名稱為「SOFT HYPHEN」)。 「編碼為 937」這個說法多半也是錯的。

  • 詢問任何字體相關問題時應當提供明確的字體信息。


因為 cmr10 這個字體包含的字元並不是按照通用的字符集來安排的。

我下載了一份 cmr10.ttf,用 ttx 命令處理成 xml 文件,查看這個字體的 cmap 表,能看到這樣一段:

&

&

也就是說,一般的字體中 U+00AD 這個碼位對應的字元是 SOFT HYPHEN(-),而在 cmr10 中被任性地安放了一個 OMEGA(Ω)。

根據 tug 網站上提供的信息(http://www.tug.org/texlive//devsrc/Master/texmf-dist/doc/latex/base/encguide.pdf),可以看到 cmr10 包含的字元:

如果要遵循 Unicode 正常顯示 OMEGA,就需要使用到 U+03A9,而考慮到 LaTeX 的特殊用途,cmr10 應該本來就沒打算設計這麼多字元吧。


cmr10 用的是老 TeX 的 OT1 編碼,映射無比奇葩。你需要的是 cmu 系列。


cmr不是unicode字體。順便說一句,你可以去找找XeLaTeX用的Latin Modern,可能編碼上會更符合標準一點。


不同的字體對每個字元的顯示不一定是一樣的,最簡單的例子,Windows裡面都有Wingdings系列字體,你可以看到這是一個特殊符號集,而不是ABCD。


推薦閱讀:

如何讓 Windows 下所有 DirectWrite 渲染的文字忽略 hinting?
有沒有值得推薦的 ClearType 宋體?
早期 TeX 的字體是否與現在 LaTeX 的不同?
怎樣更換 LaTeX 中的數學字體?
有關英文字體的所謂「支架襯線」和「非支架襯線」該如何理解?

TAG:字體 | 字體渲染 |