2017-08-06 68 views
0

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

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

Noto Sans Javanese direct download link (.zip)


使用的字形

有很多情况表明,字形不正确地进行组合,但这里我用一个例子:

  1. 爪哇LETTER NA ,U + A9A4,#43428;
  2. 爪哇曼谷,U + A9C0,#43456;
  3. JAVANESE LETTER TA,U + A9A0,#43424;
  4. JAVANESE VELLE SIGN 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结果:

Correct rendering of Javanese Script on 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#结果:

Incorrect rendering of Javanese script on Windows Form Application


问题

  1. 这种行为的原因是什么?有人可以解释吗?
  2. 我应该怎样才能使Java脚本在Windows Form Application上正确地“结合”?

非常感谢!

+0

@downvoter:为什么?这不是一个有效的问题吗? – topher

+0

这可能是一个有效的问题,如果它是一些奇怪的渲染怪癖,需要特别照顾,所以我会高兴地祝福它,但它也可能是Windows窗体中的一个简单缺陷。我建议你也把它报告给微软。 – Sander

+0

@Sander谢谢!我只是[MSDN上的一个线程](https://social.msdn.microsoft.com/Forums/en-US/33fb4f0c-36a2-411a-97ba-6c0572badd10/unicode-glyphs-not-combined-properly-on- windows-forms?forum = netfxbcl) – topher

回答

0

我收到了很少的选项和见解来帮助解决此问题。显然,这是只有在Windows 7上

Windows窗体的问题到目前为止,我的选择是:

  1. 切换到WPF应用程序(最好的选择,在我看来)
  2. 使用WPF Composite Control Windows内部形成
  3. 使用第三方库呈现为位图,例如:HarfBuzz

这里有来源,信用去给所有的作者:


  1. cheong00张贴在a MSDN Thread一个很好的解释:

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

由于IE等网页浏览器,如Chrome和Firefox都带有自己的字体渲染引擎,它们是不受GDI +渲染限制。

顺便说一句,也测试设置“UseCompatibleTextRendering”为true也没有帮助。

另一方面,WPF窗体确实呈现文本。因此请考虑将其更改为WPF应用程序,或者用WinForm hosted WPF controls替换必要的控件。


  • u/GoogleBingLady张贴在a Reddit thread见识:(定位&重排序双向性,基于上下文的整形,连字,)
  • 字体成形是一个非常非常复杂的话题。尽管我很惊讶,但Windows Forms可能不支持字体整形。

    解决方法是使用类似HarfBuzz的库,将结果呈现为位图,然后显示该位图。详情请参阅http://behdad.org/text/

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

    0

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