2017-08-06 71 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的支持。