小華的部落格: 2014/1/19 - 2014/1/26

搜尋此網誌

網頁

星期二, 1月 21, 2014

文字檔格式真多,那怎麼去區別ASCII/Big5/UTF-16/UTF-8呢?




以前處理一些字幕檔的時候,慢慢的累積了一些區別文字檔編碼的經驗,這邊就分享一下個人經驗,不過經驗歸經驗不一定正確,所以各位就將就點看,把他當成是解決你問題的一個進入點,然後再去搜尋相關知識來解決各位遇到的問題吧!

首先,我們先討論一下文字檔到底是啥? 其實不管是甚麼檔案,儲存的時候都是BINARY資料,差別就在於讀取檔案的人想要如何呈現給你看而已~

例如:

執行檔=二進制資料   , OS 讀取表頭判定他可以被執行,然後執行他!
文字檔=二進制資料   , Editor 讀取他然後依照一些編碼原則判定他,然後再去字型檔撈出字型顯示給你看!

所以啦,這篇文章要說的就是模擬一下如果我寫了一個Editor,我要怎麼區別不同的編碼格式!

從上面的圖中可以看到,一開始的時候我會先去讀取兩個位元組,這是因為Unicode(UTF-16)檔案會有一個標記來標記他是Unicode存取方式是Big Endian還是Little Endian (低位元組在記憶體低位址, x86常用) ,所以大家可以把UEFI 中的.uni 用16進制編輯器打開來看看,就會看到檔案最開頭有這個標記可以用來判斷~

如果沒有這個標記的檔案,我們就可以判斷為他可能是ASCII/UTF-8/Big-5的編碼方式,因為Big5是兩個位元組組成,他有他一定的規範,所以可以由這些規範來判別字元是不是Big5或只是單純ASCII的一個位元組而已~

除此之外,還有一個UTF-8比較討厭,因為UTF-16是固定兩個位元組儲存一個字元,所以像是英文"A"就會是0x0041 ,高位元組永遠是0x00,所以為了節省空間所以變成了可變位元組的編碼,因此一個字元可能由1~6 bytes組成,看樣子還有機會繼續延伸咧~

因此可以參考Wiki上的UTF-8的對應方式去判讀一個字元由幾個Bytes組成。

例如: 中文字 [這]
這=E9 80 99 (UTF-8)

第一個位元組的二進制是1110 1001前面的'1'代表全部是3 bytes,而後面的每個位元組的bit7:6就是對應Wiki上說的欄位表示  10xx xxxx, 10xx,xxxx

所以取出來的xxxx xxxxxx xxxxxx 
                            |       |              |____   011001    19
                            |       |____________   000000    0
                            |_________________  1001        9

U+9019 就是unicode的中文字 [這],所以UTF-8 也算是再重新編碼後的一種unicode表示碼!

不知道舉的這些例子看倌們能否了解?!

因為這不是我的專長,我是寫BIOS的,以上是經驗談~ Orz