encoding.utf8.getstring怎麼得出正確字符的

utf8編碼不是固定字節,有的是1個字節有的是2個字節有的是3個,那麼


encoding.utf8.getstring是怎麼把一堆字節解析成正確的字符,比如說有6個字節,爲什麼不會判斷成6個單字節或者1+2+3,或者3+3或者2+2+2呢?

其實是utf8編碼

0xxxxxxx                                                                                  (00-7f)
110xxxxx 10xxxxxx                                                                  (c0-df)(80-bf)
1110xxxx 10xxxxxx 10xxxxxx                                                  (e0-ef)(80-bf)(80-bf)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx                                  (f0-f7)(80-bf)(80-bf)(80-bf)
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx                  (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)

如果第一個字節二進制是110就說明2個字節,1110就說明3個字節類推,而且其他字節二進制開頭都用10來表示,而如果是0-127那麼就是單字節,這樣的格式就可以不會混淆了


比如6個字節

11001111   10000000   11100101   10010101   10001010   01000001  

110說明2字節 11001111   10000000是一個字符,第二個也是10開頭

接下來1110說明是3個11100101   10010101   10001010,後兩個也是10開頭

最後0開頭說明就1個

那麼這個字節數組轉字符串也就是“π啊A”


如果破壞了這個規則,c#會按照順序,不會後面全變亂碼,比如把第一個改成11101111,把第三個改成01100001

11101111   10000000   01100001   10010101   10001010   01000001  

那麼上來第一個1110看起來3個,第二個10開頭對了,但第3個就不符合10開頭了,所以把第一第二個先來亂碼一個?

那麼從第三個開始,發現0開頭單字節對了,於是顯示a

接下來第四個上來10開頭也不對,亂碼一個?

第五個也是上來10開頭,亂碼一個?

直到第六個0開頭,單字節,就對了,顯示A

這樣結果就是"?a??A"

這樣的好處就是不會因爲一大篇文章中壞了一點就導致整篇文章全都亂碼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章