|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-05-18, 04:08 PM | #1 |
榮譽會員
|
於DBCS的小知識
於DBCS的小知識
今天再一次開啟everest,又發現了那個很久以前就疑惑地問題——DBCS是什麼意思? 今天查了一下,原來DBCS和我們熟悉的Unicode從概念上來說是並列的。 UNICODE是世界性的字元集,幾乎包含了世界上的所有字元,每個字元都有一個單一的UNICODE值。 DBCS是亞洲的字元集,包含了ANSI,ANSI也就是ASCII值為0-255之間的字元,當字元為ANSI時,存放於文件中佔用的是一個字元。如果是非ANSI的呢,則佔用兩字元。 UNICODE的意義在於能讓不同環境下的作業系統識別。比如說吧,你在中文的作業系統下使用記事本寫了一篇文本文章。但你要拿到別的環境下的WIN2K下檢視(比如美國的電腦,作業系統為英文,程式碼頁也是美國),即使該電腦已經安裝了中文字體,即使用WORD這樣的編輯軟體開啟也肯定是亂碼一堆。這是為什麼呢?因為英文的WIN2K作業系統只能識別UNICODE。並不能識別亞洲的DBCS碼。 解決方法只要你把它轉換為UNICODE碼存放就OK了。像Utrla Edit就能轉換。WIN2K裡也有程式碼轉換器可以,而WIN2K下的記事本則可以用另chun為UNICODE碼。UNICODE碼存放的文本文件與普通的文本文件不同之處僅僅是文件頭加了"FF FE"而已。其他的則是程式碼值不同。只要轉換了字元的程式碼,並在文件前加上"FF FE"這兩個字元,就是把這篇中文文章儲存為UNICODE格式了。 轉換成UNICODE格式後,英文作業系統的機器只要用WORD開啟你的文件就能檢視(為什麼用WORD是因為它有字體識別功能。普通記事本只把文字連接到系統字體上,而英文系統的預設值字體可不是不包含中文的,當然就顯示不出來) 有興趣的可以詳細的閱讀這篇文章 首先DBCS是亞洲的字元集,包含了ANSI,ANSI也就是ASCII值為0-255之間的字元,當字元為ANSI時,存放於文件中佔用的是一個字元。如果是非ANSI的呢,則佔用兩字元。用VB的ASC函數可以很容易得到一個字元的DBCS值(或是說ANSI值吧) 假如一個字元得到的DBCS值為&H1234,當然,這個值是轉換成了十六進制的,因為對於磁牒存放來說,一般使用位(BIT),即二進制存放,而顯示字元呢用十六進制顯示則非常直觀。存放在文件中即"12 34"(這是用十六進制文本編輯器中檢視到的形式) 而UNICODE是世界性的字元集,幾乎包含了世界上的所有字元,每個字元都有一個單一的UNICODE值。UNICODE值也是佔用兩個字元的。但不同的是它雖然也包含了標準的ANSI字元值,但是ANSI字元只佔用一個字元,UNICODE會自動在ANSI值後加入一個值為0的字元。比如說一個ANSI值為&h45的字元,以UNICODE形式存放則為"45 00"。至於如何用VB得到一個字元的UNICODE值,ASCW函數可以輕鬆搞定。但是普通的非ANSI字元以UNICODE形式時則是從右存到左的。比如一個值為&H1234的字元,存為UNICODE時則為"34 12" 知道了這些有什麼用呢?UNICODE的意義在於能讓不同環境下的作業系統識別。比如說吧,你在中文的作業系統下使用記事本寫了一篇文本文章。但你要拿到別的環境下的WIN2K(之所以選WIN2K,是因為WIN2K支持UNICODE,否則用WIN98只能用外接中文平台才能檢視)下檢視(比如美國的電腦,作業系統為英文,程式碼頁也是美國(WIN2K有設定程式碼頁)),即使該電腦已經安裝了中文字體,即使用WORD這樣的編輯軟體開啟也肯定是亂碼一堆。這是為什麼呢?因為英文的WIN2K作業系統只能識別UNICODE呀!並不能識別咱們亞洲的DBCS碼呀! 解決方法只要你把它轉換為UNICODE碼存放就OK了!像Utrla Edit就能轉換。WIN2K裡也有程式碼轉換器可以,而WIN2K下的記事本則可以用另chun為UNICODE碼。如果你使用的是WIN9X,則可以自己用VB解決了。UNICODE碼存放的文本文件與普通的文本文件不同之處僅僅是文件頭加了"FF FE"而已。其他的則是程式碼值不同。只要轉換了字元的程式碼,並在文件前加上"FF FE"這兩個字元,就是把這篇中文文章儲存為UNICODE格式了!轉換成UNICODE格式後,英文作業系統的機器只要用WORD開啟你的文件就能檢視了!(為什麼用WORD是因為它有字體識別功能。普通記事本只把文字連接到系統字體上,而英文系統的預設值字體可不是不包含中文的喲!當然就顯示不出來啦) EXE等可執行文件的字串存放格式也差不多都是這樣的。不過VB編寫的程序有點意思,有些字元以DBCS存放,有些則是以UNICODE存放的。而其他工具編譯的文件則大多為DBCS單一檔案類型存放。DBCS存放的字元修改起來非常容易。使用UE這樣的十六進制文本編輯器搜尋要修改的字串,只要把「搜尋ASCII」打上勾就OK了。但是用UNICODE存放的就不好這麼找了。這下我們可以用VB來解決啦!前面已經提到,像一個值為&h1234的字元存放在文件中為"34 12" 那麼我們用VB的ASCW函數得到它的十六進制值,再把值反過來不就可以了嗎?反過來後再把這個值拿到UE中去搜尋,不要把「搜尋ASCII」選上,這下我們要修改的文字就能找到了!再用VB把要取代進去的文字也轉成相同的形式,再到UE裡對照相應的值修改即可。 一般來說,VB裡事先在開發環境下存放好的字元,如LABEL中的字元,就是以DBCS存放的。而硬編碼在EXE中的文字。比如: MSGBOX "這是編譯在程式碼中的文字" 其中這幾個中文字元就是以UNICODE形式存放的。還有資源文件中的字串資源亦是如此。 這樣一來,即使軟體作者硬編碼在EXE中的文字我們都可以隨意修改嘍。HOHO 希望我寫這篇文章對大家能有所說明 。 附:理論上程序使用UNICODE能不受作業系統環境影響,(WINDOWS的說明 上亦是如此之說)。但實際上因為受到字體連接等環境因素影響,並不能正常的顯示出文字。要使軟體國際化還是建議使用資源文件,多建幾個不同程式碼頁的字串表。這樣一來方便以後修改,二來對於EXE程序的資源佔用也有好處。 |
__________________ |
|
送花文章: 3,
|