【问题标题】:Unicode glyphs not combined properly on Windows FormsUnicode 字形在 Windows 窗体上未正确组合
【发布时间】:2018-01-13 18:11:32
【问题描述】:

问题: Javanese 脚本(使用 Google's Noto Sans Javanese font)在 HTML 上正确渲染和“组合”,但在 Windows 窗体应用程序(C# .NET、Visual Studio 2017)上 )。

编辑:我的电脑使用的是 Windows 7,64 位。

Noto Sans Javanese direct download link (.zip)


使用的字形

有很多情况表明字形没有正确组合,但这是我使用的一个示例:

  1. 爪哇字母 NA, U+A9A4, #43428;
  2. 爪哇邦孔,U+A9C0,#43456;
  3. 爪哇字母TA,U+A9A0,#43424;
  4. 爪哇元音符号 PEPET,U+A9BC,#43452;

Javanese Script Unicode Specification direct download link (.pdf)


正确/期望的行为

这些字形中的四个应该“组合”成一个字符

HTML 代码:

<html>
<head>
    <meta charset="utf-8">
    <style>
    .javanese {
    font-family: "Noto Sans Javanese";
    font-size: 66px;
    }
    </style>
</head>
<body>
    <div class="javanese">ꦤ꧀ꦠꦼ</div>
    <div class="javanese">&#43428;&#43456;&#43424;&#43452;</div>
</body>
</html>

HTML 结果:


Windows 窗体 (C# .NET) 上的渲染不正确

我正在使用 Visual Studio 2017 社区,创建一个 Windows 窗体桌面应用程序。
标签组件使用“Noto Sans Javenese”字体。

C#代码:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.label1.Text = "\uA9A4\uA9C0\uA9A0\uA9BC";
            this.label2.Text = "ꦤ꧀ꦠꦼ"; // Copied from HTML

            // this one is rendered correctly
            // Thai character "ko kai" (U+0E01) and combining characters "mai tho" (U+0E49).
            this.label3.Text = "\u0E01\u0E49\u0E49\u0E49\u0E49\u0E49\u0E49\u0E49\u0E49";
        }
    }
}

C# 结果:


问题

  1. 此行为的原因是什么?谁能解释一下?
  2. 我应该怎么做才能使 Javanese 脚本在 Windows 窗体应用程序上正确“组合”?

非常感谢!

【问题讨论】:

  • @downvoter:为什么?这不是一个有效的问题吗?
  • 这可能是一个有效的问题,如果它是一些需要特别注意的奇怪的渲染怪癖,所以我很乐意支持它,但它也可能是 Windows 窗体中的一个简单缺陷。我建议你也向微软报告。
  • @Sander 谢谢!我刚刚做了a thread on MSDN
  • 您能否提供有关您的设置的更多信息?我刚刚复制了您的项目并得到您描述为正确的输出:i.imgur.com/G7lxeeP.png ---(编辑添加:刚刚注意到您的屏幕截图看起来像是来自 Windows 7,这可能是不同的。要尝试的一件事是将标签上的 UseCompatibleTextRendering 属性设置为“true”。这将强制标签使用 GDI+ 文本渲染,这在旧版本的 Windows 上更好地支持高级脚本。)
  • @TimothyFries 感谢您重现我的问题。是的,我使用的是 Windows 7。我尝试将UseCompatibleTextRendering 设置为true,但结果仍然不正确,here's the screenshot。我同意你的观点,Win 7 可能是个问题..

标签: c# windows winforms unicode glyph


【解决方案1】:

我得到了一些选项和见解来帮助解决这个问题。显然,这只是 Windows 7 上的 Windows 窗体的问题。

到目前为止,我的选择是:

  1. 切换到 WPF 应用程序(我认为最好的选择)
  2. 在 Windows 窗体中使用 WPF Composite Control
  3. 使用第三方库渲染为位图,例如:HarfBuzz

以下是来源,致所有作者:


  1. cheong00a MSDN Thread 上发表了很好的解释:

由于Win7 has Unicode 5.1 support onlythe character \uA9A4 falls in Unicode 5.2 range,GDI+ 文本渲染功能可能无法正确处理字形提示。 (我不是 i18n 问题的专家,所以不知道是否需要特殊字形提示支持)

由于 IE 和 Chrome 和 Firefox 等其他网络浏览器都自带字体渲染引擎,因此不受 GDI+ 渲染限制。

顺便说一句,还测试了将“UseCompatibleTextRendering”设置为 true 也无济于事。

另一方面,WPF 表单确实可以正确呈现文本。所以考虑改成WPF应用,或者用WinForm hosted WPF controls替换必要的控件。


  1. u/GoogleBingLadya Reddit thread 上发表了见解:

字体整形(双向性、基于上下文的整形、连字、定位和重新排序)是一个非常非常复杂的主题。虽然我会感到惊讶,但可能是 Windows 窗体不支持字体整形。

一种解决方法是使用像 HarfBuzz 这样的库,将结果渲染为位图,然后显示该位图。详情请见http://behdad.org/text/

事实上,您的问题在第 8 页已描述:http://www.panl10n.net/Presentations/Cambodia/Pema/LocalizationofLinux(Bhutan).pdf

【讨论】:

    【解决方案2】:

    Windows 7 不支持爪哇整形。在 Windows 8.1 中添加了对 Javanese 的整形支持。

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 1970-01-01
      • 2019-02-16
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多