為什麼在知乎顯示的前引號和後引號不是「全形」?


從來就沒有全形的彎引號。

全形或半形是字元概念,全字寬或半字寬是 glyph 外觀概念。

西文彎引號和簡體中文彎引號使用的是同一組字元:「…『…』…」

這一組字元具體是顯示成西文那樣的引號,還是顯示成為中文優化過的佔一個漢字寬度的引號,完全取決於字體。

高質量的網頁設計中,大多會讓西文字體優先,然後中文字體後備。知乎就是這樣的。而瀏覽器在顯示每一個字元時都會依據字體的優先順序。於是引號等標點與阿拉伯數字、拉丁字母一起,由優先的西文字體顯示;因為漢字在西文字體中不存在,所以由後備的中文字體顯示。

@zonovo 提到的 「…『…』…」 和 "…"…"…" 的區別與全形還是半形沒一點關係。

"…"…"…" 是打字機時代為了節省鍵位而引入的「直引號」,至今都在不苛求細節的環境下使用,操作系統默認輸出的引號也是這樣。但中文環境下,因為輸入法往往能自動協助用戶輸出 「…『…』…」,所以 "…"…"…" 很少用到。

事實上,儘管彎引號 「…『…』…」 沒有自己對應的全形字元,直引號 "…"…"…" 卻可以說是有的。半形字元「"」的默認身份是直雙引號,對應全形字元「"」;而半形字元「"」的默認身份是直撇號,對應全形字元「'」。


我覺得@梁海 所說的「從來就沒有全形的彎引號」是不對的。

目前的問題,是在UNICODE編碼中,中文雙引號與西文雙引號共用了編碼造成的。

編碼的問題和字形庫(或稱字體)中某個字元是全形還是半形無關。

現在普遍使用的字形庫中,每個字都有自己的寬度屬性。某種程度上講全形半形是個點陣時代的舊概念。

近似字元共用編碼是UNICODE的一大缺點,造成了很多不必要的麻煩。

全/半形這個概念,主要是對中日韓(CJK)這三國的方塊文字有效。

編碼只是編碼,是一個數字,並不是一個字形的定義。

所以,雙引號的UNICODE編碼對應的字形,既可能是全形,也可能是半形。

在一些針對國人開發的字形庫中,雙引號為全形。

但是由於這些字形庫中的英文字元,設計得過丑。

所以很多網站採用多套字形庫。英文字母用英文字形庫。

目前通用的實現是:先匹配英文字形庫,沒有的再匹配到中文字形庫。

因為英文字形庫一般都有雙引號的字元,所以英文的雙引號被優先匹配。

而這些英文字形庫中的雙引號字形,是半形而非全形。

如果要解決這個問題,最好的方式是在UNICODE中增加專門的中文雙引號。

但這麼做,一個需要時間(包括制定修訂版編碼,和推廣新字元),一個還要考慮到歷史資料中大量使用西文雙引號的情況。

不然的話,要麼接受這樣一個不協調的雙引號,要麼通過hack手法,把雙引號都指定給全形的中文字形庫來渲染。


好像沒多少人關心中文字體的細節。不過我強迫症發作,就寫了一個客戶端(Chrome/Firefox)用戶腳本(需要Tampermonkey/Greasemonkey),也可以用來(部分)解決這個問題。

項目主頁:

GitHub - stecue/fixcjk: Fix CJK fonts/punctuations for Chrome and Firefox (Windows AND Linux!)

OpenUserJS:

https://openuserjs.org/scripts/stecuegmail.com/FixCJK!

Greasy Fork:

https://greasyfork.org/en/scripts/19812-fixcjk

之前從來沒寫過 JavaScript,目前將就能用。還請大家多賜教!


推薦閱讀:

iOS 6 以及之前版本的簡體中文標點鍵盤為何將「」作為默認引號,而不是中國大陸更常用的彎引號(「」)?
如何正確使用和打出英文的破折號?
兩個標點符號連用是否符合規範?
中文是唯一在符號形態上區分頓號與逗號的書寫系統(族)嗎?

TAG:標點符號 | 引號 |