編碼知識整理

2021-09-11 10:12:07 字數 2688 閱讀 4741

可能很多人事先沒有了解好相關的編碼知識,就把unicode編碼和utf-8編碼混為一談相互比較,認為是兩種不同的編碼,其實不然,unicoe編碼只是乙個字符集,規定了字元和二進位制**的對應關係,好比是乙個大字典,但是對於如何編碼儲存在計算機及其具體實現,unicode編碼並沒有做規定,而utf-8編碼就是unicode編碼的一種實現方式,它定義了解析儲存的一整套編碼規則,所以,就關係而言,unicode和utf-8編碼並不能做橫線比較,說到底,utf-8編碼只是實現unicode編碼的一種實現方法,並沒有重新定義字元和二進位制**的二進位制關係。

unicode編碼的出現,是為了解決各個地區定義字元編碼混亂而制定的一套業界標準,在unicode編碼出現之前,也出現過各式各樣本土化的編碼,如下所示:

編碼名稱

占用位元組數

ascii

乙個位元組

gbk兩個位元組

ascii編碼相信是大部分人最熟悉的編碼之一,它是西歐編碼,僅僅用乙個位元組表示字元,這也難怪,因為西歐大部分英文國家字符集不大,ascii編碼已經足夠用了,但是到了中國,光是漢字就有幾萬個,ascii編碼完全不夠用,所以gbk編碼由此產生,使用兩個位元組定義乙個字元,這樣就可以定義六萬多個字元。    這些不同地區使用的字元編碼,如果只是區域內使用,是完全沒有問題的,但是一旦跨地域使用不同的編碼方法,那麼就會產生各種各樣的展示問題,俗稱亂碼。當然現實生活並沒有這個問題,因為現實生活如紙張這種載體,能夠存放的字元沒有限制,而因為計算機載體的特殊性,只識別和存放得了01兩個字元,所以所有的字元經過編碼轉化最終都是以01存放在計算機內部,因此編碼不同,解析字元的規則自然不同,所以導致展示出來的字元就不相同了,就會有亂碼的可能性。    所以編碼規則本質上就是字元的解析規則,下面看幾個概念:

字元是可使用多種不同字元方案或**頁來表示的抽象實體。也可以理解為字元是乙個編碼方案的乙個最小單位。

字元集合是字元總和的集合,如unicode字符集,gbk字符集,ascii字符集

字元編碼是一種規則,為了方便網際網路傳輸,字元編碼定義了二進位制和字元的對應規則

綜合上述這幾個概念,所以無論是ascii編碼也好,gbk編碼也好,本質上都是為了二進位制和字元的轉而誕生的,而unicode只算得上是字元集合,具體的字元編碼就是utf-8編碼。utf-8是一種變長的編碼方式,規則如下:

1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的 unicode 碼。因此對於英語字母,utf-8 編碼和 ascii 碼是相同的。 2)對於n位元組的符號(n > 1),第乙個位元組的前n位都設為1,第n + 1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的 unicode 碼。

所以使用utf-8,英文本母還是占用乙個位元組,而依據unicode字符集,大部分中文都是占用了三個位元組,不過在早期的網際網路中,英文還是佔據大部分,因而utf-8編碼占用的字元消耗並不算大。後續也出現了utf-16等新的編碼方式,為了節約某些場景的儲存消耗。

windows txt 儲存文字 「你好,世界」 預設編碼格式為ansi ,ansi編碼介紹如下:

不同的國家和地區制定了不同的標準,由此產生了 gb2312、gbk、big5、shift_jis 等各自的編碼標準。這些使用 1 至 4 個位元組來代表乙個字元的各種漢字延伸編碼方式,稱為 ansi 編碼。在簡體中文windows作業系統中,ansi 編碼代表 gbk 編碼;在日文windows作業系統中,ansi 編碼代表 shift_jis 編碼。 不同 ansi 編碼之間互不相容,當資訊在國際間交流時,無法將屬於兩種語言的文字,儲存在同一段 ansi 編碼的文字中。 當然對於ansi編碼而言,0x00~0x7f之間的字元,依舊是1個位元組代表1個字元。這一點是ansi編碼與unicode編碼之間最大也最明顯的區別。

所以在windows上面就是gbk編碼,借助okio讀取如下:

public static void main(string args) throws exception 

複製**

輸出如下:

預設字符集  gbk

你好,世界

複製**

使用了預設的字元編碼去讀取位元組,預設的字元編碼是gbk,由此可知我使用的這台windows的ansi編碼就是gbk編碼。 如果使用utf8編碼去讀取位元組,輸出則是如下:

預設字符集  gbk

????????

複製**

出現了亂碼。 2. windows txt 儲存文字 「你好,世界」, 選擇編碼格式為utf8

public static void main(string args) throws exception 

複製**

輸出如下:

預設字符集  gbk

?你好,世界

複製**

神奇的是,輸出多了乙個?,這個問號是什麼呢,使用進製檢視工具winhex,檢視如下

按理說,應該是十五個位元組,但是總共有十八個位元組,並且前三個位元組不可見,查閱資料可知,在windows的文字編輯器儲存utf8格式時,會增加bom識別符號,也就是前面三個位元組,所以我們在檔案流讀取utf8格式時,要切記bom識別符號,避免程式出錯。

徹底弄懂 unicode 編碼

ios之地理編碼常用知識整理

地理編碼和反地理編碼都使用 clgeocoder 類來實現.地理編碼使用 geocodeaddressstring completionhandler 方法.將乙個地名字串轉換為經緯度。在此方法中得到乙個裝著 clplacemark 的陣列。乙個 clplacemark 表示乙個地理座標,有位置資訊...

字元編碼整理

在所有字符集中,最知名可能要數被稱為ascii的7位字符集了。它是美國資訊交換標準委員會 american standards committee for information interchange 的縮寫,為美國英語通訊所 設計。它由128個字元組成,包括大小寫字母 數字0 9 標點符號 非列...

python unicode 編碼整理

unicode 只定義字元對應的數字,但沒有規定這些數字如何儲存起來,比如像中文的 我 字儲存時需要兩個位元組來表示,而英文本母a卻只需要乙個位元組,有些其他的字元可能需要3 4個位元組。utf 8 是對 unicode 編碼儲存的一種實現方式,同樣的還有 utf 16,utf 32。utf 8 是...