編碼簡介
Unicode 概述
常常在論壇上看到很多人問 Unicode 的問題,這邊整理一些基本觀念給大家參考。
Unicode 並不是一開始就有,所以會出現的問題就是以前跟現在相容的問題。早期只有 ANSI 編碼,各國配合自己需求,在 ANSI 下加入自己的編碼需求,例如 big5、gb2312、Japanese、ASCII 等,所以常常容易混淆,事實上都是在 ANSI 下為基礎。
而 Windows 就分成兩種視窗,一種是以 ANSI 為基礎的,一種是以 Unicode 為基礎的,在 API 上的差異就是以 A 結尾的代表 ANSI ,以 W 結尾的,代表 WideChar(寬字元),也就是 Unicode ,又稱 ucs2。而 ANSI Window 是以地區預設語系顯示,也就是 控制台 地區及語言選項 進階 那個地區設定。
使用者界面
若是使用 Unicode Window 時,該視窗本身就直接支援 Unicode ,無須任何轉換,例如 .Net 下是使用 Unicode Window ,所以直接支援 Unicode ,但是若是在 .Net 下插入 COM 元件或是 VB6 的控制項,則要看該元件本身是採用 ANSI Window 或是 Unicode Window 。
而在一般的 ANSI 要支援 Unicode ,全部是沒有,但只針對日韓簡罕倒是可以安裝 Unicode 補完計畫,此軟體並非是讓 ANSI Window 變成 Unicode Window ,而是在 big5 對照表上增加 big5 碼與 Unicode 碼的對應 5 千餘字,使得 ANSI Window 上所採用的字碼能對應到 Unicode ,則在 Windows 2000/XP/2003 下正常可顯示,所以超出這個對照表外的字也是沒有。
若在 VB6 內想要使用 Unicode ,可以使用 Office 提供的 Forms 2.0 ,Forms 2.0 所有的控制項都是使用 Unicode Window,所以就直接支援 Unicode ,而 VB5/6 在記憶體中,均使用 Unicode ,就沒有轉換的問題。
檔案
無論在 VB6 還是 VBNET 下,文字檔的存取預設均是使用 ANSI ,這個應該是為了過去相容的考量,所以預設值採 ANSI ,其他編碼方式均需使用 byte() 陣列方式讀入檔案,再做編碼轉換,若是 Unicode 格式,在 VB6 無需轉換,其他格式則用 MultiByteToWideChar 轉成對應的字元,在 VBNET 則是使用 Encoding 來進行轉換,若是使用了錯誤的編碼格式,在 VB6 只是無法正確顯示,仍可經由轉換成正確的格式顯示,但是在 VBNET 會把錯誤的編碼過濾掉,再轉換就會掉碼,亦即,VB6 可以將一段 UTF8 的字串存在字串變數內,但是在 VBNET 則會發生漏字。
網頁與資料庫
瀏覽器依照 w3c 要求,允許將字碼頁以外的字元採用 nnnnn; 來傳遞,瀏覽器會自動編解碼。所以很多網頁系統並非真的支援日韓繁簡罕,但是可透過瀏覽器功能達成支援,但在寫入資料庫後,就會變成一串串的nnnnn; 無法做更進一步的應用,VBNET 寫 ASPNET 可以採用 UTF8 編碼來達成完整支援 Unicode ,asp 就會困難重重。
常常在論壇上看到很多人問 Unicode 的問題,這邊整理一些基本觀念給大家參考。
Unicode 並不是一開始就有,所以會出現的問題就是以前跟現在相容的問題。早期只有 ANSI 編碼,各國配合自己需求,在 ANSI 下加入自己的編碼需求,例如 big5、gb2312、Japanese、ASCII 等,所以常常容易混淆,事實上都是在 ANSI 下為基礎。
而 Windows 就分成兩種視窗,一種是以 ANSI 為基礎的,一種是以 Unicode 為基礎的,在 API 上的差異就是以 A 結尾的代表 ANSI ,以 W 結尾的,代表 WideChar(寬字元),也就是 Unicode ,又稱 ucs2。而 ANSI Window 是以地區預設語系顯示,也就是 控制台 地區及語言選項 進階 那個地區設定。
使用者界面
若是使用 Unicode Window 時,該視窗本身就直接支援 Unicode ,無須任何轉換,例如 .Net 下是使用 Unicode Window ,所以直接支援 Unicode ,但是若是在 .Net 下插入 COM 元件或是 VB6 的控制項,則要看該元件本身是採用 ANSI Window 或是 Unicode Window 。
而在一般的 ANSI 要支援 Unicode ,全部是沒有,但只針對日韓簡罕倒是可以安裝 Unicode 補完計畫,此軟體並非是讓 ANSI Window 變成 Unicode Window ,而是在 big5 對照表上增加 big5 碼與 Unicode 碼的對應 5 千餘字,使得 ANSI Window 上所採用的字碼能對應到 Unicode ,則在 Windows 2000/XP/2003 下正常可顯示,所以超出這個對照表外的字也是沒有。
若在 VB6 內想要使用 Unicode ,可以使用 Office 提供的 Forms 2.0 ,Forms 2.0 所有的控制項都是使用 Unicode Window,所以就直接支援 Unicode ,而 VB5/6 在記憶體中,均使用 Unicode ,就沒有轉換的問題。
檔案
無論在 VB6 還是 VBNET 下,文字檔的存取預設均是使用 ANSI ,這個應該是為了過去相容的考量,所以預設值採 ANSI ,其他編碼方式均需使用 byte() 陣列方式讀入檔案,再做編碼轉換,若是 Unicode 格式,在 VB6 無需轉換,其他格式則用 MultiByteToWideChar 轉成對應的字元,在 VBNET 則是使用 Encoding 來進行轉換,若是使用了錯誤的編碼格式,在 VB6 只是無法正確顯示,仍可經由轉換成正確的格式顯示,但是在 VBNET 會把錯誤的編碼過濾掉,再轉換就會掉碼,亦即,VB6 可以將一段 UTF8 的字串存在字串變數內,但是在 VBNET 則會發生漏字。
網頁與資料庫
瀏覽器依照 w3c 要求,允許將字碼頁以外的字元採用 nnnnn; 來傳遞,瀏覽器會自動編解碼。所以很多網頁系統並非真的支援日韓繁簡罕,但是可透過瀏覽器功能達成支援,但在寫入資料庫後,就會變成一串串的nnnnn; 無法做更進一步的應用,VBNET 寫 ASPNET 可以採用 UTF8 編碼來達成完整支援 Unicode ,asp 就會困難重重。