在Mac OS X上的Java Swing JComponent中渲染Devanagari连字(Unicode)

s.d*_*s.d 22 java unicode macos rendering ligature

我试图在Mac OS X 10.6上正确渲染Devanagari连字(在Unicode字符串中).

字符串在a上绘制JComponentRenderingHints用于抗锯齿.连字在Windows XP SP2和7以及Ubuntu中正确显示,但在Mac OS X中,连字被分解(或者更确切地说,没有正确合并),变音符被移离其位置等等(参见下面的截图,正确的渲染示例来自左侧的Win XP SP2(使用RenderingHintsAntialiasing键ON),右侧的Mac OS X 10.6.7中的错误渲染示例(Antialising DEFAULT= OFF).

我已将字体设置如下,因此它应该在任何系统上使用默认字体:

new Font(null,Font.PLAIN,20);
Run Code Online (Sandbox Code Playgroud)

我相信所有这些可能与Macs上的默认字符编码是MacRoman(不是UTF-8子集)以及其他系统(如Windows)使用UTF-8子集(例如WinLatin-1)这一事实有关. )或cp1252等.

即使掌握了这些信息,我也不知道如何处理这个问题.因此,如果有人能指出我正确的方向,我将非常感激.

正确和错误地呈现相同的字符串

我已经尝试了很多东西:

  • 将字体设置为Devanagari MT并没有解决问题
  • TextAttribute LIGATURES_ON 没有解决问题

我非常感谢任何提示或其他开发人员的代码片段(最好是在Mac上开发的印地语背景).

Mic*_*Sim 6

我自己不是专家,但这里有一些指示.据我所知,维基百科,问题很可能是你的字体.提前为长引号道歉,但我可能只是链接了两篇维基百科的文章.

这里,关于剖面的部分连字Unicode的文章:

连字

许多脚本,包括阿拉伯语和梵文,都有特殊的拼写规则,要求将某些字母组合组合成特殊的连字形式.管理连接形成的规则可能非常复杂,需要特殊的脚本整形技术,例如ACE(1980年代由DecoType制作的阿拉伯语书法引擎,并用于生成Unicode标准的印刷版中的所有阿拉伯语示例),这成为证明OpenType(由Adobe和Microsoft),Graphite(由SIL International提供)或AAT(由Apple提供)的概念.

AAT(Apple高级版式)文章中进一步阅读,揭示了以下信息.我建议阅读整篇文章.

Mac OS X中的AAT和OpenType

从Mac OS X 10.5 Leopard开始,可以获得对OpenType的部分支持.该支持目前仅限于西方文字和阿拉伯文(截至2011年).如果字体具有AAT表,则它们将用于排版.如果字体没有AAT表但具有OpenType表,则它们将在系统支持的范围内使用.

这意味着可以在Mac OS X 10.5上无需修改即可使用西方或中东脚本的许多OpenType字体,但泰国和梵文等南亚脚本则不能.这些需要AAT表才能正确布局.

稍后在关于字体布局的部分中:

由于AAT完全使用字形并且从不使用字符,因此生成正确显示所需的所有布局信息都位于字体本身内.这允许为新脚本添加字体,而无需OS的任何特定支持.

最后:

印度语脚本的AAT

对于印度语脚本,唯一需要的功能是字形重新排序和替换.AAT支持这两种方式.如上所述,用于印度语脚本的OpenType字体需要在Mac OS X上正常运行之前添加AAT表.但是,请注意,这仅适用于依赖于OpenType系统支持的软件.提供自己的OpenType实现的程序将使用OpenType字体正确呈现Document.(但是,它们可能无法正确呈现带有AAT表的印度字体.)

Mac OS X 10.5附带了Devanagari,Gurmukhi,Gujarati,Thai,Tibetan和Tamil的字体.其他印度语脚本的字体可从第三方获得.

也许您需要选择明确支持梵文的字体.


tra*_*god 3

使用 Quartz 渲染器而不是 Java 2D 渲染器。

这对字形渲染的质量产生了很大的影响。需要首先按照此处的建议完成此操作。

if (System.getProperty("os.name").startsWith("Mac OS X")) {
    System.setProperty("apple.awt.graphics.UseQuartz", "true");
}
Run Code Online (Sandbox Code Playgroud)

您也可以考虑使用TextLayout,因为FontRenderContext可以应用RenderingHints.KEY_FRACTIONALMETRICS