中英文混排:自动处理引号

通过内嵌带有 lang 标记的 <span> 标签来正确处理中英文混排时的引号字体问题。

Motivation

现在的字体大多数都有针对 Unicode 开闭引号 ‘’“” 有特殊的设计,大多数内容也不再使用 ASCII 引号 "。 同样,Hugo 在解析时也会将 ASCII 引号转化为 Unicode 引号。

但问题是 Unicode 没有区分中英文引号,而英文字体大多数时候是半个汉字宽,且 font-family 在中文字体前。

这使得中文里使用英文引号非常痛苦,十分丑陋。

若是利用 font-face 和 Unicode Range 专门建立一个中文引号字体,如:

@font-face {
  font-family: "Chinese Quote";
  src: local('Source Han Sans CN'), url(/fonts/SourceHanSansCN-Regular.otf);
  unicode-range: U+2018, U+2019, U+201c, U+201d;
}

又会导致英文里显示的也是中文引号,更加痛苦了。

解决方案

于是我糙快猛地写了一个小脚本,类似于解析 code 块一样,将文本解析成中文和英文,然后往源元素下插入解析后的、带有 lang 标记的 <span> 标签,再利用 :lang() 选择器使用不同的字体,即可达成混排时也能正确显示引号的效果。

由于主题的样式和格式比较复杂,目前我只应用在了 header tag 和 p 上。

实际上这个解决方案并不非常合理。因为混排时英文引号应该仅在整句等处使用,而不是所有英文。

此外,由于 :lang 伪类优先级高于 class,大概率需要新增很多 CSS 规则。

引号之神

FuHsi.js

演示

鉴于我的字体设置没有经过完善的测试,可能并不是所有环境都有效的,放一个截图在这。

示例

混合“引号”与 “Quotes”

“Mary said,‘It’me.’”,他说。

“引号”

“引号”,和英文 “english”

it’me 的中文含义是什么?

“引号“mixed”

不要总是对女孩说“Pretty!”

他站在那,感叹了句“What a beautiful scene!”

“He is man.”“He is a man.”“He is the man”的区别是什么?

“中文 English English”。

English English 中文”。

中文“中文 English English”。English

中文“中文 English English”。中文

English“中文 English English”。中文

English“中文 English English”。English

中文“English English”。English

中文“English English”。中文

English“English English”。English

English“English English”。中文


中文“引号”

English “Quotes”

混合“引号”与 “Quotes”