【问题标题】:Unicode characters aren't combined properlyUnicode 字符组合不正确
【发布时间】:2018-12-06 10:40:04
【问题描述】:

我正在处理一些我想在浏览器中显示的梵文文本数据。不幸的是,有一种非间距组合字符的组合不会被渲染为适当的组合字符。

每次将基本字符与 天城文重音符号 Udatta ॑ (U+0951)天城文符号 Visarga ः (U+0903) 组合时,都会出现问题。

र॑ः 就是一个例子,即र (U+0930) + + 并且应该呈现为一个字符。但是重音符号和另一个似乎不喜欢对方(如您在上面看到的!)。
将基本字符与其他两个符号单独组合起来没有问题,顺便说一句:र॑ / रः

我已经尝试使用几种应该能够呈现梵文字符的字体(一些 Noto 字体、Siddhanta、GentiumPlus)并用不同的浏览器对其进行了测试,但问题似乎是其他问题。

有人有想法吗?这不是有效的符号组合吗?

编辑:我只是试图切换这两个标记,看看会发生什么 - 它呈现为 रः॑,所以 U+0951U+0903 似乎没有相同的功能,因为重音符号得到了呈现在另一个标记之上。
看来我对 Unicode 的理解还不够。

【问题讨论】:

    标签: unicode combining-marks font-rendering


    【解决方案1】:

    这不是解决您问题的方法,但可能是有用的信息:

    我正在处理一些我想在 浏览器。

    和你一样,尽管尝试了几种字体,包括 Arial Unicode MS,但我无法让它在任何浏览器中工作:

    浏览器只是从 JSP 的 <body> 中呈现文本 Devanagari Test: रः॑。重音符号明显出现在 Sign Visarga 上方,而不是基本字符。

    这不是有效的符号组合吗?

    这是一个有效的组合。我不知道梵文,所以我不知道它在语义上是否“有效”,但从 Java 应用程序中准确生成您想要的字符是微不足道的:

    System.out.println("Devanagari test: \u0930\u0903\u0951");

    这是执行println() 调用的输出,在基本字符上方显示重音符号:

    上面的屏幕截图来自 Windows 10 上的 NetBeans 8.2,但使用最新版本的 Eclipse 和 Intellij IDEA 渲染效果也很好。约束是:

    • 必须在println() 中按该顺序指定三个字符,才能进行渲染。
    • Sign VisargaStress Sign Udatta 必须以其 Unicode 格式呈现。将它们的字形表示粘贴到源代码中是行不通的,尽管这可以对基本字符进行。
    • 必须为显示使用适当的字体。我在上面的屏幕截图中使用了 Arial Unicode MS,但也使用了其他字体,例如 SerifSansSerifMonospaced工作。

    有人有想法吗?

    很遗憾没有,尽管很明显:

    • 您要渲染的字形存在,并且有效。
    • 虽然它不会在浏览器中呈现,但可以通过 Java 应用程序将其写入控制台。
    • 问题似乎是所有浏览器都将变音符号 (Stress Sign Udatta) 应用于紧接前面的字符而不是基本字符。

    有关更多信息,请参阅Why are some combining diacritics shifted to the right in some programs?

    【讨论】:

    • 感谢您的意见!我的问题特别是关于浏览器中的字体渲染,但无论如何这很有趣。到目前为止,我已经意识到它在某些浏览器/操作系统配置中可以正常工作,甚至可以连接到操作系统特定的字体渲染。如果我找到解决方案,我会在这里发布。
    猜你喜欢
    • 2011-04-16
    • 2019-03-08
    • 1970-01-01
    • 2012-01-23
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2012-08-08
    相关资源
    最近更新 更多