国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中字符編碼簡介、方法及使用建議

2019-11-25 18:02:39
字體:
來源:轉載
供稿:網友

1. 字符編碼簡介

1.1. ASCII

ASCII(American Standard Code for Information Interchange),是一種單字節的編碼。計算機世界里一開始只有英文,而單字節可以表示256個不同的字符,可以表示所有的英文字符和許多的控制符號。不過ASCII只用到了其中的一半(/x80以下),這也是MBCS得以實現的基礎。

1.2. MBCS

然而計算機世界里很快就有了其他語言,單字節的ASCII已無法滿足需求。后來每個語言就制定了一套自己的編碼,由于單字節能表示的字符太少,而且同時也需要與ASCII編碼保持兼容,所以這些編碼紛紛使用了多字節來表示字符,如GBxxx、BIGxxx等等,他們的規則是,如果第一個字節是/x80以下,則仍然表示ASCII字符;而如果是/x80以上,則跟下一個字節一起(共兩個字節)表示一個字符,然后跳過下一個字節,繼續往下判斷。

這里,IBM發明了一個叫Code Page的概念,將這些編碼都收入囊中并分配頁碼,GBK是第936頁,也就是CP936。所以,也可以使用CP936表示GBK。

MBCS(Multi-Byte Character Set)是這些編碼的統稱。目前為止大家都是用了雙字節,所以有時候也叫做DBCS(Double-Byte Character Set)。必須明確的是,MBCS并不是某一種特定的編碼,Windows里根據你設定的區域不同,MBCS指代不同的編碼,而Linux里無法使用MBCS作為編碼。在Windows中你看不到MBCS這幾個字符,因為微軟為了更加洋氣,使用了ANSI來嚇唬人,記事本的另存為對話框里編碼ANSI就是MBCS。同時,在簡體中文Windows默認的區域設定里,指代GBK。

1.3. Unicode

后來,有人開始覺得太多編碼導致世界變得過于復雜了,讓人腦袋疼,于是大家坐在一起拍腦袋想出來一個方法:所有語言的字符都用同一種字符集來表示,這就是Unicode。

最初的Unicode標準UCS-2使用兩個字節表示一個字符,所以你常常可以聽到Unicode使用兩個字節表示一個字符的說法。但過了不久有人覺得256*256太少了,還是不夠用,于是出現了UCS-4標準,它使用4個字節表示一個字符,不過我們用的最多的仍然是UCS-2。

UCS(Unicode Character Set)還僅僅是字符對應碼位的一張表而已,比如"漢"這個字的碼位是6C49。字符具體如何傳輸和儲存則是由UTF(UCS Transformation Format)來負責。

一開始這事很簡單,直接使用UCS的碼位來保存,這就是UTF-16,比如,"漢"直接使用/x6C/x49保存(UTF-16-BE),或是倒過來使用/x49/x6C保存(UTF-16-LE)。但用著用著美國人覺得自己吃了大虧,以前英文字母只需要一個字節就能保存了,現在大鍋飯一吃變成了兩個字節,空間消耗大了一倍……于是UTF-8橫空出世。

UTF-8是一種很別扭的編碼,具體表現在他是變長的,并且兼容ASCII,ASCII字符使用1字節表示。然而這里省了的必定是從別的地方摳出來的,你肯定也聽說過UTF-8里中文字符使用3個字節來保存吧?4個字節保存的字符更是在淚奔……(具體UCS-2是怎么變成UTF-8的請自行搜索)

另外值得一提的是BOM(Byte Order Mark)。我們在儲存文件時,文件使用的編碼并沒有保存,打開時則需要我們記住原先保存時使用的編碼并使用這個編碼打開,這樣一來就產生了許多麻煩。(你可能想說記事本打開文件時并沒有讓選編碼?不妨先打開記事本再使用文件 -> 打開看看)而UTF則引入了BOM來表示自身編碼,如果一開始讀入的幾個字節是其中之一,則代表接下來要讀取的文字使用的編碼是相應的編碼:

BOM_UTF8 '/xef/xbb/xbf'
BOM_UTF16_LE '/xff/xfe'
BOM_UTF16_BE '/xfe/xff'

并不是所有的編輯器都會寫入BOM,但即使沒有BOM,Unicode還是可以讀取的,只是像MBCS的編碼一樣,需要另行指定具體的編碼,否則解碼將會失敗。

你可能聽說過UTF-8不需要BOM,這種說法是不對的,只是絕大多數編輯器在沒有BOM時都是以UTF-8作為默認編碼讀取。即使是保存時默認使用ANSI(MBCS)的記事本,在讀取文件時也是先使用UTF-8測試編碼,如果可以成功解碼,則使用UTF-8解碼。記事本這個別扭的做法造成了一個BUG:如果你新建文本文件并輸入"姹

主站蜘蛛池模板: 新巴尔虎左旗| 孟连| 建宁县| 广宗县| 桐庐县| 札达县| 营山县| 烟台市| 太康县| 南昌市| 叙永县| 惠东县| 安康市| 大同市| 青河县| 青海省| 河北区| 垣曲县| 井陉县| 平原县| 潞西市| 礼泉县| 陇川县| 建瓯市| 甘德县| 临湘市| 玛曲县| 乌鲁木齐县| 临沭县| 张家口市| 青冈县| 辉南县| 营口市| 玉龙| 宁夏| 道真| 应用必备| 武宣县| 苏尼特左旗| 竹山县| 深州市|