3

我正在维护一个 Android 应用程序,人们用它来显示各种异国语言的字符串,如藏语或古希腊语。由于安卓设备自带的字体很少,用户可以将字体文件放在SD卡上,应用程序就会使用它们。

问题:给定一个字符串,我怎样才能自动决定哪个字体文件最合适,以便这个字符串出现而不用正方形/框替换字符?

笔记:

  • 每个字符串都使用一种语言。
  • 字符串显示在 WebView 中。
  • 自定义字体工作,唯一的问题是决定使用哪个字体文件。
  • 它可以提供该字符串可接受的字体列表,而不是单个字体。

出于好奇,不必要的上下文:我正在尝试开发此功能: http ://code.google.com/p/ankidroid/issues/detail?id=779


更新:我最终根据 Mostafa 的想法创建了Antisquare开源库。
它有一种getSuitableFonts非常快的方法。

4

1 回答 1

4

Android 本身并不能为此类任务提供足够的功能。在 Android 中加载和渲染字体在 Skia 中进行,它是用 C 语言编写的。Skia 检测是否在字体中找不到字符,并针对此类字符(不是整个字符串)回退到另一种字体。这就是日文、希伯来文或阿拉伯文文本在 Android 中的显示方式,这正是这些脚本没有粗体的原因!(他们的字体是通过后备选择的,后备只选择一个字体文件。)

不幸的是,API 中没有提供这种机制,您必须自己构建类似的东西。它看起来很复杂,但比看起来容易。你所要做的就是:

  1. 准备每个字体文件中可用的字符列表。
  2. 对于每个字符串,找到字符串中包含更多字符的字体。

获取每种字体中的字符列表

您不必在 Android 应用程序中即时执行此操作。您可以准备每种字体的字符列表并将这些列表放入您的应用程序中。我这么说是因为使用 Android 中可能不可用的工具更容易做到这一点。我会通过字体应用程序中的 Python 脚本来做到这一点(大多数严肃的字体工具都有很棒的 Python 脚本环境),但是这些应用程序很昂贵,并且适合严肃的字体设计师。由于您是 Android 开发人员,我建议使用sfntly,这是一个 Java 和 C++ 库。使用 sfntly 可以轻松完成所需的操作(获取字体文件中可用的 Unicode 字符列表)。此示例适用于 CMap 表(保存字符到字形映射的表),对您来说应该是一个很好的起点。

现在有趣的部分是 snftly 是用 Java 编写的,您可以将其包含在您的 Android 应用程序中并自动执行所有操作。这太棒了,我建议您从熟悉 snftly 开始。

选择字体

在上一部分之后,您将获得每种字体的 Unicode 字符列表,并且基于这些列表选择提供每个字符串的大多数字符的字体文件是微不足道的。

于 2012-03-12T11:46:40.217 回答