以前處理一些字幕檔的時候,慢慢的累積了一些區別文字檔編碼的經驗,這邊就分享一下個人經驗,不過經驗歸經驗不一定正確,所以各位就將就點看,把他當成是解決你問題的一個進入點,然後再去搜尋相關知識來解決各位遇到的問題吧!
首先,我們先討論一下文字檔到底是啥? 其實不管是甚麼檔案,儲存的時候都是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
沒有留言:
張貼留言