除utf-8之外的字元編碼格式是怎麼解決大尾端與小尾端的問題的?
01-15
最近研究字元編碼,對gb,Unicode有了一定了解,但同時有了更多的疑問:
在看到utf-16時發現各大博客與資料都說了一下這種編碼格式存在的位元組順序問題以及解決辦法,還看到了utf-8為防止這種問題所採取的方法,那麼問題來了。除這兩種外的編碼格式是怎麼解決位元組順序問題的呢?我特意研究了一下GB2312,GBK,EASCⅡ等多位元組的編碼格式,發現他們也沒像utf-8一樣採用什麼處理位元組順序問題的方法呀?
編程小白感覺十分迷茫求大神指教。
GB2312、GBK等編碼是與UTF-8類似,並沒有大端小端的區別,因為這些編碼已經規定好了第一個位元組是什麼,第二個位元組是什麼,等等。而UTF-16每一個編碼單位是一個16位整數,但並沒有硬性規定這個整數是使用大端還是小端進行存儲,所以才會有大端和小端兩種存儲方式,並使用BOM進行區分。
附:GB2312-1980 標準原文節選
UTF-16的話是使用BOM來判斷位元組序的,如果BOM不存在的話就有概率出事。GBK貌似沒有BOM什麼的,所以應該是,傳輸協議會規定一種位元組序,除此之外得靠元數據來標識吧。。。
因為gbk utf8的存儲單位是位元組,存儲介質的最小存儲單位也是位元組,所以並沒有位元組順序的問題,文件系統已經規定好了從文件的哪一端讀。
而utf16的存儲單位是雙位元組,那麼存在一個問題,一個utf16的存儲單位里有兩個存儲介質的存儲單位,哪個在前哪個在後就要去規定一下。
這跟發送數據時,位元組為單位的數據不需要使用網路位元組序,int等多位元組單位的數據需要轉換網路位元組序是一樣的。多位元組的就存在位元組序問題,一個位元組只能表示256個符號,雙位元組可以表示65536個符號,後者基本夠用了。
位元組序的解決方法很多,相當於規定一種字元編碼的協議,但我沒讀過字元編碼標準,不知道標準委員會咋規定的。推薦閱讀:
※如何評價不同平台上各種 emoji 的設計?
※如何才能推動國家教育部推出支持Unicode最新版的全漢字宋楷黑仿免費字型檔?
※爲什麼沒有根據字形編碼的漢字處理解決方案?
※「?」(U+2F49)與「月」(U+6708)是不是同一字?
TAG:編程 | Unicode統一碼 | C編程語言 | 字元編碼 | 計算機網路 |