国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python unicode 編碼整理

longshengwang / 3150人閱讀

摘要:如果統(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 和 unicode

python2 中有字符串類型有兩種: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è)漢字『美的』。

encodedecode提供 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, in 
    print repr(s2.decode("GBK"))
UnicodeDecodeError: "gbk" codec can"t decode bytes in position 2-3: illegal multibyte sequence

這里同樣可以知道,s2中存放的是文件保存的編碼UTF-8的byte碼。

References

http://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

相關(guān)文章

  • PythonUnicode

    摘要:最近使用處理一些網(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...

    Tangpj 評(píng)論0 收藏0
  • python中的編碼問(wèn)題

    摘要:在控制臺(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) 。于...

    forsigner 評(píng)論0 收藏0
  • 關(guān)于解決Python亂碼問(wèn)題的終極解決方案 (TL;DR)

    摘要:關(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)象...

    Lemon_95 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)Python]坑爹的字符編碼

    摘要:所以,哪怕是初學(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é)者,都要...

    rozbo 評(píng)論0 收藏0
  • 編碼-1

    摘要:關(guān)于的參考知乎上的一個(gè)回答傳送門以我自己的理解就是首先得分清楚編碼問(wèn)題在不同的環(huán)境中,編碼是不同的。但是如果換成的是知乎的話,則表示的是將這個(gè)漢字用編碼的形式存放。 文章啟發(fā)來(lái)源: cnblogs 阮一峰 知乎 字符編碼方式 note from wiki: 從維基百科上得到的一些理解,一個(gè)字符的unicode編碼是確定的,但是在傳輸過(guò)程中,由于不同系統(tǒng)平臺(tái)的設(shè)計(jì)不一致,所以對(duì)uni...

    IamDLY 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<