如果將2000系統的預設語言切換為日文(或英文,正體中文),你將發現很多軟體輸出的是
一堆亂碼或?。其它人的程式也就罷了,可是,俺們提供給使用者的程式也這樣。偏偏使用者中
有小日本,他用中文win2000,但卻將預設語言設為日文,唉。
出現問題描述:
我們的程式結構是:客戶端的輸出採取html(混合vb指令碼),關鍵業務採用activex控制項。
控制項由vc編寫。亂碼為vc編寫的activex控制項中的輸出。
分析一下原因:
1:vb或vb指令碼在呼叫com時,如果com為非unicode版本,在傳遞字串(string)引數時,
會將字串按本地預設**頁進行轉換,如果當前的本地**頁並不是預期的簡體中文頁
(如936),則會出現轉換失敗的情況,也就是將傳遞"?"字元到com(或者說ocx)。這時,出現
資訊丟失和不正確,會輸出?。
2:在顯示dc中繪製字串時,需要指定正確的字型(font),特別是字型的字符集設定(charset),
否則,在進行文字輸出時,無法進行正確的字型檔定位。如果未指定字型字符集,應該會採用預設
語言設定的字符集,也就是說:如果中文內碼未指定字符集,而採用預設的日文字符集,將出
現字型對應錯,會顯示出亂碼。
前提,對應字符集的預設**頁一定要存在和正確先。
解決方法:
1:控制項應編譯為unicode版,這樣,vb在傳字元引數時,將會傳遞unicode版,不與本地預設語言
相關。不會出現內碼轉換的過程,也不會出現資訊丟失(轉換生成"?")。
同理,vc寫的程式,想直接拿到其它預設語言環境下,可以直接使用,請將所有輸出變為unicode。
2:呼叫控制項時,一定要設定正確的字符集。如:在簡中環境時,需要將ldger的字型字符集設定為
gb2312_charset。對英文和繁體環境對應是:ansi_charset,chinesebig5_charset
注意:如果用vc呼叫控制項時,如果控制項為ansi版,則可以傳遞對應ansi內碼(因為vc並不存在類似vb的字元
串轉換的步驟)。但是,如果vc呼叫unicode版的控制項時,需要將傳入字串變為unicode傳入,這樣,
才能保證內碼正確。
附1:顯示亂碼一般有兩個原因,
一是內碼不正確,一般是由於自動的轉碼造成資訊丟失。可能會出現"?"(預設的轉碼失敗處理為?)。
二是顯示的問題,具體每種顯示處理可能會不同(沒完全去總結過),上述只是處理了在dc上進行最基
本繪製的處理,它與字型字符集設定相關。而對於一些開發工具提供的資源的顯示,還需要區分處理
,當然,如果乾脆在最底層控制它的繪製,一般就可以處理正確,但比較麻煩。並且,在這點上,vc
好辦(視窗都可以subclass),但是對於vb的程式,反正你可以試試vb寫的程式,其提供的資源在其它
預設語種的環境下大都是顯示亂碼或?。暫不清楚該如何處理,只知道或者可以都變成,呵。
附2:在html中有標識可以指定頁面中字元編碼集。
而控制項的預設屬性繼承于父窗體,所以,只要你的控制項中顯示輸出的字型採用控制項級的字型,那麼,
控制項使用者就無需對字符集進行設定了,它預設為採用html頁中的指定字符集。
石頭 整理於2005-09-01
修改系統預設語言
一 簡介 在linux的系統中經常碰到字符集導致的錯誤,本文總結了設定修改系統語言環境的方法步驟。二 操作步驟 執行如下指令,檢視當前使用的系統語言 echo lang 執行如下指令,檢視系統安裝的語言包 locale 有zh cn表示已經安裝了中文語言,如果沒有中文語言,可以執行如下指令,安裝中文...
android系統預設語言設定
只需要對android build target languages full.mk 中product locales zh cn enus.最前面的一種語言既為預設語言,系統編譯後自動設定屬性到系統中,在 build tools buildinfo.sh echo ro.product.local...
修改 Android 系統預設語言
方法1.product locales 檢視build target product core.mk 發現product brand generic product device generic product name core 把product locales en us zh cn zh tw...