編碼的那些事兒

其實不管是用哪種編碼,本質(zhì)上保存的都是二進(jìn)制。
一些基本概念與易錯點(diǎn):

  1. 不同的編碼,占用的字節(jié)數(shù)是不一樣的。字符在不同的編碼占用的字節(jié)是不相同的,一個字節(jié)是8位。所以說,你看到的字符串到底占用多少個字節(jié),要取決于到底是用了哪種編碼。比如在 GB 2312 編碼或 GBK 編碼中,一個漢字字符存儲需要2個字節(jié)。在UTF-8編碼中,一個漢字字符儲存需要3到4個字節(jié)。
  2. iOS中的NSData其實就是二進(jìn)制。由于從上面已經(jīng)知道一個漢字在不同的編碼,占用的字節(jié)數(shù)是不一樣的,所以占用的位數(shù)也就可能不一樣。所以其實不難理解,為什么要是用對應(yīng)的編碼才能轉(zhuǎn)換為正確的字符串了。
  3. 不要以為保存的數(shù)據(jù)就肯定能從某種編碼中得到正確的字符串,實際上可能對字節(jié)數(shù)組進(jìn)行了修改,不再是UTF8編碼了。比如:UTF8編碼生成的文件,可能由于加密等原因,先轉(zhuǎn)換為字節(jié)數(shù)組,對字節(jié)數(shù)組進(jìn)行了處理了,然后保存。看到的則是亂碼了。解碼部分,肯定也是對字節(jié)數(shù)組處理。所以說,如果編碼修改了,兩邊就會無法匹配到一起,假如可以部分匹配到一起,那么可能兩種的字母都是占用一個字節(jié),然后漢字字節(jié)數(shù)不同。
  4. 一些加密過的數(shù)據(jù),如果進(jìn)行UTF8來解碼,又編碼,會發(fā)現(xiàn)數(shù)據(jù)導(dǎo)致?lián)p壞。比如字節(jié)數(shù)組修改后,這時實際上用UTF8來解碼,得到的字符串實際上已經(jīng)不是原來的了。比如字節(jié)FF和FE在UTF-8編碼中永遠(yuǎn)不會出現(xiàn),但是由于修改了,出現(xiàn)了這樣的字節(jié)就會出錯。所以導(dǎo)致UTF8先解碼,然后編碼的結(jié)果不一致。
  5. 看到一樣,不代表編碼一樣。一個漢字不同的編碼可能占用不同的字節(jié)數(shù),就是說二進(jìn)制位數(shù)不相同。所以文件可能是不同的編碼,看到的卻是一樣的字符串。
  6. nodejs可以使用iconv-lite來進(jìn)行編碼轉(zhuǎn)換。
  7. nodejs中buffer類的單位是字節(jié)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容