更新:
甲骨文接受了我的错误报告:
https ://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8223834
您将在下面找到可能的解决方法:
这似乎是 Font2D 类的 Mac OS 实现中的一个错误。
我能够使用反射解决这个问题。这是在 Mac 上产生正确结果的代码。它在 Kotlin 中,但如果有必要,将其转换为 Java 应该很简单。
// Mac OS workaround for incorrectly implemented canDisplayUpTo method
fun Font.macCanDisplayUpTo(str: String): Int {
val getFontMethod = Font::class.java.getDeclaredMethod("getFont2D")
getFontMethod.isAccessible = true
val font2d = getFontMethod.invoke(this)
val getMapperMethod = font2d.javaClass.getDeclaredMethod("getMapper")
getMapperMethod.isAccessible = true
val mapper = getMapperMethod.invoke(font2d)
val charToGlyphMethod = mapper.javaClass.getDeclaredMethod("charToGlyph", Char::class.java)
val len = str.length
var i = 0
while (i < len) {
val c = str[i]
val glyph = charToGlyphMethod.invoke(mapper, c) as Int
if (glyph >= 0) {
i++
continue
}
if (!Character.isHighSurrogate(c)
|| (charToGlyphMethod.invoke(mapper, str.codePointAt(i)) as Int) < 0) {
return i
}
i += 2
}
return -1
}
如果您使用的是 Java 9 或更高版本,则需要将这些命令参数传递给 VM 以使代码正常工作:
--add-opens java.desktop/java.awt=your.module.name
--add-opens java.desktop/sun.font=your.module.name
此代码在 Windows 上不起作用(会产生不正确的结果)。它仅适用于 MacOS。