Android:找出哪个字体文件适合我想要显示的字符
我正在维护一个Android应用程序,人们用它来显示各种异国语言的字符串,比如藏语或古希腊语。由于Android设备的字体很少,用户可以将字体文件放在SD卡上,应用程序将使用它们 问题:给定一个字符串,我如何自动确定哪个字体文件最合适,以便该字符串显示时不会用方框/方框替换字符 注:Android:找出哪个字体文件适合我想要显示的字符,android,fonts,custom-font,Android,Fonts,Custom Font,我正在维护一个Android应用程序,人们用它来显示各种异国语言的字符串,比如藏语或古希腊语。由于Android设备的字体很少,用户可以将字体文件放在SD卡上,应用程序将使用它们 问题:给定一个字符串,我如何自动确定哪个字体文件最合适,以便该字符串显示时不会用方框/方框替换字符 注: 每个字符串都使用一种语言 字符串显示在Web视图中 自定义字体工作,唯一的问题是决定使用哪个字体文件 它可以提供该字符串可接受的字体列表,而不是单个字体 不必要的上下文,出于好奇:我正在尝试开发此功能:
- 每个字符串都使用一种语言
- 字符串显示在Web视图中
- 自定义字体工作,唯一的问题是决定使用哪个字体文件
- 它可以提供该字符串可接受的字体列表,而不是单个字体
更新:我最终根据Mostafa的想法创建了开源库。
它有一个
getSuitableFonts
方法,速度非常快。Android本身并不能提供足够的功能来完成这项任务。在Android中加载和呈现字体是在Skia中进行的,Skia是用C编写的。Skia会检测字体中是否有字符,并针对这些字符返回到另一种字体(而不是整个字符串)。这就是日语、希伯来语或阿拉伯语文本在Android中的显示方式,这正是这些脚本没有粗体字体的原因!(他们的字体是通过回退选择的,回退只选择一个字体文件。)
不幸的是,API中没有提供这种机制,您必须自己构建类似的东西。这看起来很复杂,但比看起来容易。你所要做的就是:
在上一部分之后,您将有一个每个字体的Unicode字符列表,根据这些列表选择提供每个字符串中大多数字符的字体文件非常简单。我将您的想法作为开源实现:我希望许多人会找到它,使用它并扩展它:-)@NicolasRaoul哦,太棒了。很高兴它有帮助,也很高兴你分享了你的解决方案。snftly在Android上运行良好。然而,使用它又引出了一个问题。有人知道Skia使用哪种cmap表吗?我猜这是Unicode表的全部或一个子集(请参阅),但最好能确定。