防止浏览器使用默认/回退字体

19
我有一个 Web 应用程序,用户可以以 WSIWYG 的方式更改输入文本区域的字体系列。现在,假设用户在文本区域中输入一些中文文本,但选择了不支持中文字符的字体。在我的应用程序中,我希望用户能够看到那些通常在字体不支持字符时显示的难看的方块(或类似物),这样用户就会知道该字体不支持该语言并可选择其他字体。我遇到的问题是,浏览器(Firefox 17 和 Chrome 23)似乎会使用支持中文字符的字体(如 Arial)来呈现文本的中文部分,让用户相信他正在尝试使用的字体可以正常工作。
有没有一种方法(我猜想是通过 CSS)可以防止这种情况发生?是否有一种方法可以让浏览器不要那么“友善”,仅限于此次不使用支持中文字符的字体?
提前感谢您的回答。

也许在网站上先放置一个语言选择器,当用户选择后,再确定用户可以选择哪些字体? - Billy Moat
@Billy:没用的,字体引擎会进行替换。 - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams,您可以将可用字体限制为不需要替换的字体。 - Enrico
@Enrico:你打算如何枚举它们? - Ignacio Vazquez-Abrams
我不打算枚举任何东西。鉴于可用字体列表已知,验证给定字体支持哪些字符集是微不足道的。 - Enrico
2个回答

17
作为另一个答案已经解释过的,解决方法是使用包含“全部”Unicode代码点的备用字体。然而,困难的部分是找到或构建一个不会超过几MB的备用字体。
几年后,现在有一个更轻量级的备用字体解决方案,Adobe的NotDef字体。它显示了一个带有十字架的框,用于1,111,998个Unicode代码点,只有约22Kb,并使用SIL OPEN FONT LICENSE Version 1.1。
如果您不想显示任何内容,还有Adobe Blank字体

这看起来就是我要找的。你知道这个能不能也支持表情符号吗?也就是说,如果他们输入了一个表情符号字符,那么小方框会显示出来吗?我可以自己试一下,但是我现在没有带着我的笔记本电脑 :) - teewuane
回答自己的问题,是的,这是一种非常优雅的方式让人们知道表情符号不起作用。它并不漂亮,但它很诚实。 - teewuane

9
您可以通过添加一个捕获所有字体的字体来拦截字体替换过程,使用类似于font-family: userChoice, yourCatchAll的等效方法,其中yourCatchAll是具有通用字符的字体。

问题在于找到这样的字体。Unicode联盟分发的LastResort字体将是理想的选择,因为它还以广义术语可视化字符的类别,但其最终用户许可协议似乎不允许修改。这是否适用于web字体格式(如.eot和.woff)的构建是有争议的。 Unicode BMP Fallback Font似乎具有更自由的使用规则,但它仅将字符显示为其Unicode编号在框中(并且仅支持基本多语言平面,尽管它包含大多数人听说过的所有字符)。

嗯...这看起来很有希望,但浏览器似乎仍然会回退到Arial字体。不过我会继续尝试的!谢谢 - Savir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接