1、源起: VCU10項目,使用了Noto Sans字體,的確漂亮。但驗證在win7下,其顯示韓文為亂碼,頗為頭痛。 其界面顯示如圖: 度娘之,得Noto Sans又有CJK字體,顧名思義,其為支持中日韓文,且其體積巨大,不宜做為方案,繼續思考! 2、Font.GdiCharSet 屬性 也是沒有辦 ...
1、源起:
VCU10項目,使用了Noto Sans字體,的確漂亮。但驗證在win7下,其顯示韓文為亂碼,頗為頭痛。
其界面顯示如圖:
度娘之,得Noto Sans又有CJK字體,顧名思義,其為支持中日韓文,且其體積巨大,不宜做為方案,繼續思考!
2、Font.GdiCharSet 屬性
也是沒有辦法,看在目前基礎上,能不能解決問題?程式多國語言需支持。
就從字體本身屬性開始檢查吧,驗證發現,改其字元集GdiCharSet,可正常顯示韓文,解決方案有了!
查閱資料得知,字體GdiCharSet可有如下值:
字元集 |
值 |
---|---|
ANSI |
0 |
DEFAULT |
1 |
符號 |
2 |
SHIFTJIS 適用 |
128 |
韓語 |
129 |
北韓語 |
129 |
GB2312 |
134 |
CHINESEBIG5 適用 |
136 |
OEM |
255 |
韓文 |
130 |
希伯來語 |
177 |
阿拉伯語 |
178 |
希臘語 |
161 |
土耳其語 |
162 |
越南語 |
163 |
泰語 |
222 |
EASTEUROPE |
238 |
俄語 |
204 |
MAC |
77 |
波羅的語 |
186 |
驗證比如東歐、波羅的海等字元集,可以正常顯示韓文,而不影響其預設字元集顯示效果,於是,決定替換其字元集。
3、替換
項目界面已設定字體,且界面眾多,一個一個改當然不夠方便,寫代碼批量處理吧!
在每個窗體,或每個UserControl中,調用一下UpdateNotoSansCharset()數,就統一替換了。
//處理Label字體,以能在win7下,NotoSans字體能顯示韓文 public static void UpdateNotoSansCharset(Form form) { if (OSUtils.OSVersion > FriendlyOSVersion.Win7) return; foreach (Control ctrl in form.Controls) UpdateNotoSansCharset(ctrl); } public static void UpdateNotoSansCharset(ScrollableControl parent) { if (OSUtils.OSVersion > FriendlyOSVersion.Win7) return; foreach (Control ctrl in parent.Controls) UpdateNotoSansCharset(ctrl); } public static void UpdateNotoSansCharset(GControl ctrl) { if (ctrl is ScrollableControl) UpdateNotoSansCharset(ctrl as ScrollableControl); else if (ctrl is Label) { //CharSet採用中歐字元集 var font = new Font(ctrl.Font.FontFamily, ctrl.Font.Size, ctrl.Font.Style, ctrl.Font.Unit, 238); ctrl.Font = font; } }
4、效果
OK,難題解決,非常完美: