摘要:如果統(tǒng)一規(guī)定每個(gè)字符用個(gè)或者個(gè)字節(jié)來(lái)存儲(chǔ),那么每個(gè)英文字符都必然需要額外到個(gè),這對(duì)存儲(chǔ)是很大的浪費(fèi)。因此對(duì)于英語(yǔ)字母,編碼和碼是相同的。中文中文輸出這里同樣可以知道,中存放的是文件保存的編碼的碼。
unicode 與 utf-8 的關(guān)系 unicode 是 character set
character set 是把每個(gè)字符對(duì)應(yīng)成數(shù)字的集合,比如unicode中 A對(duì)應(yīng)0041,漢字『我』對(duì)應(yīng) "6211"
unicode 是個(gè)很大的集合,幾乎覆蓋世界上所有的字符,現(xiàn)在的規(guī)模已經(jīng)可以容納100萬(wàn)個(gè)字符。
utf-8 是對(duì) unicode 存儲(chǔ)的實(shí)現(xiàn)方式unicode 只定義字符對(duì)應(yīng)的數(shù)字,但沒(méi)有規(guī)定這些數(shù)字如何存儲(chǔ)起來(lái),比如像中文的『我』字存儲(chǔ)時(shí)需要兩個(gè)字節(jié)來(lái)表示,而英文字母A卻只需要一個(gè)字節(jié),有些其他的字符可能需要3-4個(gè)字節(jié)。
如果統(tǒng)一規(guī)定每個(gè)字符用3個(gè)或者4個(gè)字節(jié)來(lái)存儲(chǔ),那么每個(gè)英文字符都必然需要額外2到3個(gè)0,這對(duì)存儲(chǔ)是很大的浪費(fèi)。
如果每個(gè)字符按照實(shí)際需要的字節(jié)數(shù)來(lái)存儲(chǔ),計(jì)算機(jī)就分不清三個(gè)字節(jié)是表示三個(gè)字符還是一個(gè)字符。
utf-8 是對(duì) unicode 編碼存儲(chǔ)的一種實(shí)現(xiàn)方式,同樣的還有 utf-16, utf-32。
utf-8 是使用最廣泛的編碼方式,采用變長(zhǎng)的編碼方式,可以使用1-4個(gè)字節(jié)來(lái)表示一個(gè)字符; utf-16 用2個(gè)或4個(gè)字節(jié),utf-32 用4個(gè)字節(jié)表示。編碼規(guī)則如下:
對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的unicode碼。因此對(duì)于英語(yǔ)字母, UTF-8編碼和ASCII碼是相同的。
對(duì)于n字節(jié)的符號(hào)(n>1),第一個(gè)字節(jié)的前n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的unicode碼。
python2 中的 str 和 unicodepython2 中有字符串類型有兩種:byte string (str)和 unicode string (unicode)。
>>> s = "美的" >>> s "xe7xbex8exe7x9ax84" >>> s = u"美的" >>> s u"u7f8eu7684" >>> s = "美的" >>> s.decode("utf-8") u"u7f8eu7684"
上面的輸出中,第一個(gè)s的類型是 str,打印出來(lái)的內(nèi)容是 utf-8 編碼過(guò)的內(nèi)容。第二個(gè)s的類型是 unicode,打印出來(lái)的兩個(gè)雙字節(jié)的數(shù)字分別表示了兩個(gè)漢字『美的』。
encode和decode提供 str 和 unicode 這兩種的類型的互相轉(zhuǎn)化。
encode 把 unicode 轉(zhuǎn)化成 str(byte string)
decode 把 str(byte string) 轉(zhuǎn)化成 unicode
本質(zhì)上,str是存放的字節(jié)序,有可能是 ascii, gbk, utf-8 等等中的任意一種,通過(guò)調(diào)用 decode 可以把他們轉(zhuǎn)化成 unicode ,默認(rèn)的 decode 編碼是 ascii 。str中到底是用的哪一種編碼,取決于它所在的場(chǎng)景,跟 locale ,文件編碼等等都有關(guān)系。
文本文件、編輯器的處理#!/usr/bin/env python # -*- coding: GBK -*- s = u"中文" print repr(s) print repr(s.encode("GBK"))
比如上面的文件enc.py,保存的時(shí)候選擇文件編碼是GBK,程序文件本質(zhì)上也是文件,當(dāng)我們使用某個(gè)外部的應(yīng)用 打開(kāi)它時(shí)(編輯器或者python解釋器等),外部應(yīng)用是不知道該文件的編碼格式的,
這個(gè)時(shí)候有三種情況:
應(yīng)用使用其默認(rèn)的編碼方式去解析,比如UTF-8或者ASCII;python解釋器默認(rèn)是ASCII,編輯器可以自己設(shè)置;
應(yīng)用根據(jù)文件中的字節(jié)內(nèi)容,自動(dòng)檢測(cè)編碼方式;
文本文件告訴應(yīng)用使用什么編碼方式去解碼;比如# -*- coding: GBK -*-告知解釋器使用GBK來(lái)解碼;
試驗(yàn)一下,把# -*- coding: GBK -*-刪除后,執(zhí)行python enc.py,輸出:
File "enc.py", line 4 SyntaxError: Non-ASCII character "xd6" in file enc.py on line 4, but no encoding declared;
試著用vim打開(kāi)該文件時(shí),『中文』兩個(gè)字就會(huì)顯示成亂碼,因?yàn)関im默認(rèn)的文件編碼方式被設(shè)置成UTF-8了。
#!/usr/bin/env python # -*- coding: GBK -*- s1 = u"中文" print repr(s1) print repr(s1.encode("GBK")) s2 = "中文" print repr(s2) print repr(s2.decode("GBK"))
輸出結(jié)果:
u"u4e2du6587" "xd6xd0xcexc4" "xd6xd0xcexc4" u"u4e2du6587"
從這里可以看出來(lái), s2中存放的是byte格式的從文件中讀到的GBK編碼的內(nèi)容。
再看下面的這段代碼,程序文件utf8_enc.py,保存成UTF-8編碼的。
#!/usr/bin/env python # -*- coding: utf-8 -*- s1 = u"中文" print repr(s1) print repr(s1.encode("GBK")) s2 = "中文" print repr(s2) print repr(s2.decode("GBK"))
輸出:
u"u4e2du6587" "xd6xd0xcexc4" "xe4xb8xadxe6x96x87" Traceback (most recent call last): File "unicode_enc.py", line 12, inprint repr(s2.decode("GBK")) UnicodeDecodeError: "gbk" codec can"t decode bytes in position 2-3: illegal multibyte sequence
這里同樣可以知道,s2中存放的是文件保存的編碼UTF-8的byte碼。
Referenceshttp://www.rrn.dk/the-differe...
http://www.ruanyifeng.com/blo...
https://docs.python.org/2/how...
http://yergler.net/2012/bytes...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/38215.html
摘要:最近使用處理一些網(wǎng)絡(luò)相關(guān)的問(wèn)題,被相關(guān)的一系列編碼問(wèn)題搞得一頭霧水。與接下來(lái)是中對(duì)于字符串的處理。中的和在中,其類型規(guī)定了底層的數(shù)據(jù)結(jié)構(gòu),是位整數(shù)串,也即跟語(yǔ)言中的字符串類似。這些問(wèn)題在中得到解決。 最近使用 Python 2 處理一些網(wǎng)絡(luò)相關(guān)的問(wèn)題,被 Unicode, String 相關(guān)的一系列編碼問(wèn)題搞得一頭霧水。在這里整理一下相關(guān)的概念吧。 ASCII Unicode UTF8...
摘要:在控制臺(tái)執(zhí)行命令中文,可以將解釋為命令,中文,從而到到對(duì)象。中文以上的對(duì)象其實(shí)是,即字節(jié)碼,若終端是編碼的話,那么就是用的字節(jié)碼。那么這里的是什么呢默認(rèn)是,這正是錯(cuò)誤為什么報(bào)無(wú)法用解碼的原因中文將默認(rèn)編碼改為,即可。 問(wèn)題 在平時(shí)工作中,遇到了這樣的錯(cuò)誤: UnicodeDecodeError: ascii codec cant decode byte 想必大家也都碰到過(guò),很常見(jiàn) 。于...
摘要:關(guān)于解決亂碼問(wèn)題的終極解決方案有個(gè)特別好玩的現(xiàn)象,當(dāng)我們?yōu)榱司幋a頭疼的時(shí)候,幾乎搜索到所有的文章都會(huì)先發(fā)一通牢騷。另外,關(guān)于的亂碼問(wèn)題,又是一個(gè)新的較長(zhǎng)篇章。 關(guān)于解決Python亂碼問(wèn)題的終極解決方案 (TL;DR) showImg(https://segmentfault.com/img/remote/1460000013229494?w=809&h=184); 有個(gè)特別好玩的現(xiàn)象...
摘要:所以,哪怕是初學(xué)者,都要了解并能夠解決字符編碼問(wèn)題。在這個(gè)世界上,有好多不同的字符編碼。目前最新的版本為,已收入超過(guò)十萬(wàn)個(gè)字符第十萬(wàn)個(gè)字符在年獲采納。涵蓋的數(shù)據(jù)除了視覺(jué)上的字形編碼方法標(biāo)準(zhǔn)的字符編碼外,還包含了字符特性,如大小寫字母。 字符編碼,在編程中,是一個(gè)讓學(xué)習(xí)者比較郁悶的東西,比如一個(gè)str,如果都是英文,好說(shuō)多了。但恰恰不是如此,中文是我們不得不用的。所以,哪怕是初學(xué)者,都要...
閱讀 2571·2021-11-22 09:34
閱讀 3548·2021-11-15 11:37
閱讀 2351·2021-09-13 10:37
閱讀 2111·2021-09-04 16:40
閱讀 1589·2021-09-02 15:40
閱讀 2466·2019-08-30 13:14
閱讀 3334·2019-08-29 13:42
閱讀 1910·2019-08-29 13:02