java - 哪个系统组件负责在 Java 应用程序中绑定(bind) Unicode 连字?

标签 java unicode character-encoding rendering system

这是一个“元问题”,是我在尝试为我的另一个问题 (Rendering Devanagari ligatures (Unicode) in Java Swing JComponent on Mac OS X) 寻找更好的规范时遇到的。

目前我不太明白的是给定系统的哪个“组件”(需要一个更好的词)负责在 Java 中显示 Unicode 文本,更具体地说是连字 .

据我了解,以下组件会影响流程:

  1. 系统字符编码(例如,在 Mac OS X 10.6 上为 UTF-8,在 Windows 7 上为 UTF-16(根据 akira 对此 superuser.com post 的评论))。
  2. Java Charset(在 Mac OS X 10.6 上默认为 MacRoman,在 Windows 7 上默认为 cp1252)。
  3. 用于呈现文本的字体,以及该字体的编码信息(正如 Donal Fellows 在 my other question 上所建议的:

    "fonts include information about what encoding they're using".

  4. 显然要呈现的字符是否存在于相应的 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/

相关文章:

c++ - 在 C++ 中获取正确编码的字符串

apache-spark - spark 读取非 UTF-8 编码的 wholeTextFiles

java - 如何引用内部类成员的泛型类型?

java spring 上下文 :property-placeholder manually loading

perl - 您如何在 Perl 或任何其他编程语言中对 CJK(亚洲)字符进行排序?

regex - 正则表达式以匹配不同Unicode脚本之间的边界

javascript - 如何使用 Javascript 发布 Content-Type header 中同时包含 "application/x-www-form-urlencoded"和 "charset=UTF-8"的 HTML 表单

java - 匹配到逗号前最后 3 个字符的正则表达式

java - ActiveMq 结合 Tomcat

python - 当你同时拥有 str 和 unicode 时,让类充当 Python 中的字符串