【问题标题】:Detect if a unicode character is supported?检测是否支持 unicode 字符?
【发布时间】:2016-11-04 21:25:49
【问题描述】:

我正在尝试构建一个可以随机向用户返回表情符号的小型 android 应用程序。我的意图是只使用实际的 unicode emoji 字符,并将它们作为 unicode 字符串字符返回。

我构建了一个完整的 unicode 字符串数组,可以从中随机选择,并且很多都可以正确显示。但是有些显示为不受支持的字符(一个带有 x 的矩形)。

显然,并非每个平台都支持每个 unicode 表情符号字符,但如果可能的话,我想要一种方法来确定什么是受支持的字符,哪些不是。理想的情况是查询支持的字符列表,但能够测试单个字符也可以很好地完成这项工作。

【问题讨论】:

  • 您找到解决方案了吗?谢谢!
  • @Maragues 不幸的是,我放弃了自己,只拥有一个常量数组,在其中手动定义了我可以期望工作的安全表情符号。
  • 看起来 Android 23 确实包含了一些东西 (developer.android.com/reference/android/graphics/…),但是代码调用了本机函数,所以我想我不走运。感谢您的快速响应
  • @Maragues,你为什么不走运?是因为您需要支持 pre-API 23 还是因为 hasGlyph 不适合您?
  • 我什至不记得我想做什么了 :(

标签: android unicode


【解决方案1】:

还可以查看Paint.hasGlyph(String),它是在 API 级别 23 中添加的。您可以使用它来测试像表情符号这样的字符是否有可用的字形。

documentation 是这么说的:

boolean hasGlyph (String string)

判断在paint上设置的字体是否有字形支持 字符串。最简单的情况是当字符串包含单个 字符,此方法确定字体是否具有 特点。在多个字符的情况下,该方法返回true 如果有代表连字的单个字形。例如,如果 输入是一对区域指标符号,判断是否 这对有一个表情符号标志。

最后,如果字符串包含一个变体选择器,该方法只 如果字体包含特定于该变体的字形,则返回 true。

检查是在整个后备链上完成的,而不仅仅是直接的 引用的字体。

另见

【讨论】:

  • 那是在画图上。
  • @clwhisk,谢谢。已更新。
【解决方案2】:

因此,当您谈论“不受支持”的字符时,听起来您的意思是当前字体没有字符的字形(或者应用程序没有后备逻辑来查找使用的字体不同,或者系统没有任何字体使用)。

在常规 Java 中,这非常简单:给定一个 java.awt.Font 的实例,您可以使用 the canDisplay method 查看它是否具有给定 Unicode 字符的字形。

无论出于何种原因,Android API 似乎都没有提供一种方法来确定您实际使用的字体。 (android.graphics.Typeface 将该信息保密:请参阅 "Check the family of a Typeface object in Android"。)但是,您至少可以尝试类似new java.awt.Font("SansSerif", java.awt.Font.PLAIN, 12) 的方法来获得基本的 12 点无衬线字体。当然,您需要测试一下,看看这是否为 real 字体能够显示的表情符号提供了一个可用的近似值。

【讨论】:

  • 您对我的意思完全正确。谢谢(你的)信息! Android api似乎根本不包含java.awt.Font,所以我无法导入它并使用该方法。但我会看看我可以用 Typeface 做什么,并尝试将其转换为更可用的字体,或者可能只是尝试设置一个我知道何时不支持字形的默认字体。
  • 哦,很奇怪——我没有意识到 Android 省略了部分 JDK。 (我不是 Android 开发者,如果你不知道的话。:-P)
【解决方案3】:

您可以使用Character.isDefined 来检查字符是否在设备上的Unicode 版本中定义。

【讨论】:

  • 啊,这是一个很好的线索。谢谢!不幸的是,它只是偶尔发现问题。有很多误报,这让我觉得它没有在 Android 中正确实现。
  • Character.isDefined 表示“JVM 知道这是什么字符吗?” (例如,无论是空格、数字还是......),而 OP 想要“当前字体是否有这个字符的字形?”。
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
相关资源
最近更新 更多