这是一个“元问题”,是我在尝试为我的另一个问题 (Rendering Devanagari ligatures (Unicode) in Java Swing JComponent on Mac OS X) 寻找更好的规范时遇到的。
目前我不太明白的是给定系统的哪个“组件”(需要一个更好的词)负责在 Java 中显示 Unicode 文本,更具体地说是连字 .
据我了解,以下组件会影响流程:
- 系统字符编码(例如,在 Mac OS X 10.6 上为 UTF-8,在 Windows 7 上为 UTF-16(根据 akira 对此 superuser.com post 的评论))。
- Java
Charset
(在 Mac OS X 10.6 上默认为 MacRoman,在 Windows 7 上默认为 cp1252)。 - 用于呈现文本的字体,以及该字体的编码信息(正如 Donal Fellows 在 my other question 上所建议的:
"fonts include information about what encoding they're using".
- 显然要呈现的字符是否存在于相应的 Unicode 代码点。
因此,如果一串 Unicode 字符没有正确显示(如我的另一个问题 s.a. 所示),问题最有可能出在哪里?即,什么“组件”(更好的词是什么?)负责“绑定(bind)”连字及其组成?
非常感谢您,如果您需要更多信息,请告诉我。
最佳答案
该系统组件称为字体渲染器或字体光栅化器。它负责根据字体中定义的字形将一系列字符代码转换为像素。正如其他答案所述,您可以从 Java 获取和设置的各种字符编码值是无关紧要的。当 JVM 给字体渲染器一个字符代码序列时,它会告诉它应用什么编码(可能是 UTF16,但这对 Java 程序员来说是透明的。)字体渲染器使用字体文件中指定的字体编码来匹配相应的字形。
当前版本的 Windows 和 Mac OS X 带有出色的字体渲染器。
第一个混淆点是 JRE 带有自己的字体渲染器,作为 Java2D 平台的一部分,而这正是 Swing 使用的。应该有一个选项来控制 Java 是使用自己的渲染器还是系统渲染器。
编辑:作为McDowell在评论中指出,在 OS X 上,您可以通过设置 Java 属性 apple.awt.graphics.UseQuartz=true 来启用系统渲染器。
第二个混淆点是连字在英文中是可选的。当桌面出版应用程序看到像“shuffle”这样的词时,它会替换为“ffl”连字(字体中的单个字形),但大多数其他应用程序不会打扰。根据您所说的梵文(以及我刚刚在维基百科上阅读的内容),我认为连字在该语言中不是可选的。
默认情况下,Java2D 字体渲染器不进行连字。但是,java.awt.font.TextAttribute.LIGATURES 的 JavaDoc 说连字总是为需要连字的书写系统启用。如果这不是您的经验,您可能发现了 Java2D 字体呈现器中的错误。同时,尝试使用获取字体属性映射的字体构造函数,包括 TextAttribute.LIGATURES。
关于java - 哪个系统组件负责在 Java 应用程序中绑定(bind) Unicode 连字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6032401/