其實現今Windows的介面是Unicode,從XP以來就是
如果不是的話,為何檔案名子可以取日文、簡體、泰文?(附圖1)
一般常在說的Big5編碼Windows
指的是Windows如何對待以ANSI碼撰寫的程式
(圖1)
在網路上,還是有少部分網站使用非UTF8編碼
當我們選用正確的編碼解析出文字時(圖2)
再對文字按右鍵複製,那我複製到的是甚麼編碼?
複製到的是Unicode編碼,就是因為windows是Unicode
在顯示的過程中已經做了一次原始編碼「轉換」為Unicode的事情了
畫面上才顯示的出來這些字
(圖2)
這邊可以將「轉換」動作理解為一個函式
假設我要將UTF8轉換為Big5,稱作 UTF8_Big5()
帶入參數為UTF8文字,回傳值為Big5文字,當參數預期外時,就輸出問號
該問號是一個Default值,也就是Big5編碼的問號(\x3F)
同理,在Notepad裡是可以貼上任何語言文字,並且正常顯示的
因為他本來就是個Unicode程式,跟Windows一樣
只有等到存檔時,才會問說要把文件存成甚麼格式
如果包含Unicode字元,Notepad就會跟你抱怨要不要存成ANSI以外的格式(圖3)
當我們不理會警告,把UTF8字元轉換成ANSI文件時,就會造成上述的轉換失敗
一堆Default值,因此有大量的資訊流失了,被(\x3F)這個值取代掉
(圖3)
而在Notepad++中,若選擇「編譯成UTF8模式」
該Notepad++環境就會是UTF8,貼上日文字的同時
系統會發現來源與目標編碼不同,因此自動呼叫 Unicode_UTF8()
因為兩者可完美轉換,因此是可以正常顯示的,這段文字也會是UTF8編碼
當我選擇「編譯成ANSI模式」時
我的Notepad++環境就會變成Big5,貼上日文字時呼叫 Unicode_Big5()
因此產生一堆問號,因為Big5根本沒這些日文字,轉換失敗
這時文字編碼會是Big5,但我儲存的是問號這個字 (\x3F)
但是當我把日文貼在PCMAN這個Big5環境的介面時,為何能是日文?
這要說到在十幾年前,Windows還不是Unicode而是ANSI(Big5)
台灣人為了能夠在Windows上使用日文做交流
發明了「櫻花輸入法」這個東西
在Big5造字區製造了日文字,讓使用者可以看到這些字
並配合櫻花輸入法輸入這些文字
但事實上這些字是台灣人自創的「假日文」字
過了不久後,windows底層改成Unicode了,不需要假日文了
因此誕生了個叫做「Unicode補完計畫」的東西
他正是修改了Unicode_Big5()、Big5_Unicode()這兩個函式
前者讓Unicode日文參數輸入能得到Big5假日文的輸出,而不會是Default值(\x3F)
後者則是讓Big5的假日文字輸入,能夠得到真正Unicode日文字的輸出
而不會是未定義文字
(Unicode每個輸入都能對應輸出,只是看這個輸出有沒有被定義,不會得到Default)
隨後Unicode補完計畫不斷發展,自行造字、補充Unicode轉換連結
將使用Unicode補完計畫的Big5,重新定義為Big5-UAO
目前使用Big5-UAO的大宗網站為PTT,也可能是台灣僅存的Big5-UAO使用網站了
由於Unicode補完計畫衍生的問題太多,最終解決方案為
將Unicode補完計畫的效用限制於軟體內,不再去修改系統的轉換了
例如PCMAN演化成内建Big5-UAO支援
這邊可以測試,從日文網站複製日文可以完整貼上PCMAN
從泰國網站複製泰文時,卻貼不上了
這表示這個環境絕對不是UTF8
當使用Telnet連上ptt時,可以發現日文字全部變空白了(圖4)
這就是ANSI下的Big5無法辨識Big5-UAO的證明
若複製日文字貼上telnet則是一堆問號
因為telnet不像PCMAN一樣內建類似Unicode補完計畫的功能
另外在PTT網頁版瀏覽時,Server會將Big5-UAO內容轉換成UTF8顯示給網頁端
(圖4)