s.d*_*s.d 6 java unicode rendering system character-encoding
这是一个"元问题",当我试图为我的另一个问题找到更好的规范时,我遇到了这个问题(在Mac OS X上的Java Swing JComponent中渲染Devanagari连字符(Unicode)).
到目前为止我还不太了解的是给定系统的哪个"组件"(想要更好的词)负责在Java中显示Unicode文本,更具体地说是连字.
据我了解,以下组件对流程有影响:
Charset(默认情况下是Mac OS X 10.6上的MacRoman,Windows 7上的cp1252)."字体包含有关他们正在使用的编码的信息".
因此,如果一串Unicode字符无法正确显示(如我的另一个问题所示,sa),问题最可能出在哪里?即,什么"组件"(更好的词会是什么?)负责"绑定"结扎,它的组成?
非常感谢您提前,如果您需要更多信息,请告诉我.
该系统组件称为字体渲染器或字体光栅器。它负责根据字体中定义的字形将字符代码序列转换为像素。正如其他答案所述,您可以从 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 字体渲染器中的错误。同时,尝试使用采用字体属性映射的 Font 构造函数,包括 TextAttribute.LIGATURES。