摘要:二進(jìn)制位,是計(jì)算機(jī)內(nèi)部數(shù)據(jù)儲(chǔ)存的最小單位,是一個(gè)位二進(jìn)制數(shù)。由于源代碼也是一個(gè)文本文件,所以,當(dāng)你的源代碼中包含中文的時(shí)候,在保存源代碼時(shí),就需要?jiǎng)?wù)必指定保存為編碼。
計(jì)算機(jī)存儲(chǔ)的幾個(gè)概念
想要徹底搞清楚編碼問(wèn)題,我們必須要先搞清楚計(jì)算機(jī)是怎么存儲(chǔ)數(shù)據(jù)的,這就涉及到了計(jì)算機(jī)基礎(chǔ)的幾個(gè)概念了,開(kāi)篇我們就先來(lái)捋捋這幾個(gè)容易混淆的概念。
bit二進(jìn)制位, 是計(jì)算機(jī)內(nèi)部數(shù)據(jù)儲(chǔ)存的最小單位,11010100是一個(gè)8位二進(jìn)制數(shù)。一個(gè)二進(jìn)制位只可以表示0和1兩種狀態(tài)(2^1);兩個(gè)二進(jìn)制位可以表示00、01、10、11四種(2^2)狀態(tài);三位二進(jìn)制數(shù)可表示八種狀態(tài)(2^3)……
Byte字節(jié),是計(jì)算機(jī)中數(shù)據(jù)處理的基本單位,計(jì)算機(jī)中以字節(jié)為單位存儲(chǔ)和解釋信息,規(guī)定一個(gè)字節(jié)由八個(gè)二進(jìn)制位構(gòu)成,即1個(gè)字節(jié)等于8個(gè)比特(1Byte=8bit)。八位二進(jìn)制數(shù)最小為00000000,最大為11111111;通常1個(gè)字節(jié)可以存入一個(gè)ASCII碼,2個(gè)字節(jié)可以存放一個(gè)漢字國(guó)標(biāo)碼。
字在計(jì)算機(jī)中,一串?dāng)?shù)碼作為一個(gè)整體來(lái)處理或運(yùn)算的,稱為一個(gè)計(jì)算機(jī)字,簡(jiǎn)稱宇。字通常分為若干個(gè)字節(jié)(每個(gè)字節(jié)一般是8位)。在存儲(chǔ)器中,通常每個(gè)單元存儲(chǔ)一個(gè)字,因此每個(gè)字都是可以尋址的。字的長(zhǎng)度用位數(shù)來(lái)表示。在計(jì)算機(jī)的運(yùn)算器、控制器中,通常都是以字為單位進(jìn)行傳送的。
字長(zhǎng)字長(zhǎng):電腦技術(shù)中對(duì)CPU在單位時(shí)間內(nèi)(同一時(shí)間)能一次處理的二進(jìn)制數(shù)的位數(shù)叫字長(zhǎng)。所以能處理字長(zhǎng)為8位數(shù)據(jù)的CPU通常就叫8位的CPU。同理32位的CPU就能在單位時(shí)間內(nèi)處理字長(zhǎng)為32位的二進(jìn)制數(shù)據(jù)。
字節(jié)和字長(zhǎng)的區(qū)別:由于常用的英文字符用8位二進(jìn)制就可以表示,所以通常就將8位稱為一個(gè)字節(jié)。字長(zhǎng)的長(zhǎng)度是不固定的,對(duì)于不同的CPU、字長(zhǎng)的長(zhǎng)度也不一樣。8位的CPU一次只能處理一個(gè)字節(jié),而32位的CPU一次就能處理4個(gè)字節(jié),同理字長(zhǎng)為64位的CPU一次可以處理8個(gè)字節(jié)。
常見(jiàn)的編碼ASCII: 1個(gè)字節(jié),只編碼英文字母和符號(hào)
gb2312: 2個(gè)字節(jié),增加了中文漢字和符號(hào)
Unicode: 把所有語(yǔ)言都統(tǒng)一到一套編碼里把所有語(yǔ)言都統(tǒng)一到一套編碼里,
一般是2個(gè)字節(jié),生僻字4個(gè)字節(jié)
utf-8: 可變長(zhǎng)編碼,常用的英文字母被編碼成1個(gè)字節(jié),漢字通常是3個(gè)字節(jié),只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)。如果你要傳輸?shù)奈谋景罅坑⑽淖址?,用UTF-8編碼就能節(jié)省空間:
在計(jì)算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼,當(dāng)需要保存到硬盤(pán)或者需要傳輸?shù)臅r(shí)候,就轉(zhuǎn)換為UTF-8編碼,這樣可以節(jié)省很多存儲(chǔ)空間。
Python編碼注:這里討論的是python2.7的情況
兩個(gè)函數(shù)在python中,str和unicode都是basestring的子類,basestring有以下兩個(gè)方法:
encode(): 將unicode字符串轉(zhuǎn)換為其他編碼字符串,參數(shù)為轉(zhuǎn)換后編碼
decode(): 將其他編碼轉(zhuǎn)換為unicode字符串,參數(shù)為轉(zhuǎn)換前編碼
PS:"string".decode("utf-8") == unicode("string", "utf-8")
一個(gè)栗子s = "中文" print type(s), len(s) u = u"中文" print type(u), len(u) u2s = u"中文".encode("utf-8") print type(u2s), len(u2s)
結(jié)果是這樣的
6 2 6
console下查看u2s
>>> u"中文".encode("utf-8") "xe4xb8xadxe6x96x87"
結(jié)論:
python中定義的一個(gè)str變量實(shí)則是字節(jié)串,由Unicode經(jīng)過(guò)編碼(encode)后的字節(jié)組成的(
也正好印證了utf8編碼中一個(gè)中文字符是3個(gè)字節(jié))
Unicode才是真正意義上的字符串,由字符組成
再次回顧兩個(gè)函數(shù)用法
s = "中文" # 這時(shí)是str,轉(zhuǎn)為unicode需要用decode u = s.decode("utf-8") print type(u) # 打印# unicode轉(zhuǎn)為str ,使用encode s2 = u.encode("utf-8") print type(s2) # 打印
新結(jié)論:不同編碼轉(zhuǎn)換,使用Unicode作為中間編碼
#s是code_A的str s.decode("code_A").encode("code_B")
在Python 3.x版本中,把"xxx"和u"xxx"已經(jīng)都統(tǒng)一成Unicode編碼了,即寫(xiě)不寫(xiě)前綴u都是一樣的,而以字節(jié)形式表示的字符串則必須加上b前綴:b"xxx"。
由于Python源代碼也是一個(gè)文本文件,所以,當(dāng)你的源代碼中包含中文的時(shí)候,在保存源代碼時(shí),就需要?jiǎng)?wù)必指定保存為UTF-8編碼。當(dāng)Python解釋器讀取源代碼時(shí),為了讓它按UTF-8編碼讀取,我們通常在文件開(kāi)頭寫(xiě)上這兩行:
#!/usr/bin/env python # -*- coding: utf-8 -*-參考
字節(jié)、字、位、比特,這四者之間的關(guān)系
廖雪峰:python2.7教程之字符串和編碼
PYTHON-進(jìn)階-編碼處理小結(jié)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/38227.html
摘要:關(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)象...
摘要:如果構(gòu)造函數(shù)有返回值呢一般情況下構(gòu)造函數(shù)沒(méi)有返回值,但是我們依舊可以得到該對(duì)象的實(shí)例如果構(gòu)造函數(shù)有返回值,憑直覺(jué)來(lái)說(shuō)情況應(yīng)該會(huì)不一樣。歡迎光臨小弟博客我的博客原文你真的弄明白了嗎參考再談面向?qū)ο缶幊痰膶?shí)例化與繼承請(qǐng)停止使用關(guān)鍵字 好久沒(méi)有寫(xiě)點(diǎn)東西了,總覺(jué)得自己應(yīng)該寫(xiě)點(diǎn)牛逼的,卻又不知道如何下筆。既然如此,還是回歸最基本的吧,今天就來(lái)說(shuō)一說(shuō)這個(gè)new。關(guān)于javascript的new關(guān)鍵...
摘要:補(bǔ)充的知識(shí)這個(gè)是原型中的自帶屬性,指向構(gòu)造函數(shù)這個(gè)屬性其實(shí)是瀏覽器實(shí)現(xiàn)的,不是標(biāo)準(zhǔn)的訪問(wèn)原型的方式中規(guī)定的正式方法是以上知識(shí),最終的圖如下思考題在文章開(kāi)頭我們說(shuō)過(guò)函數(shù)也是對(duì)象,既然是對(duì)象就有原型,那的原型指向誰(shuí)呢是嗎 文章開(kāi)頭說(shuō)的話 首先你必須明白(或者記住)的JavaScript常識(shí): 在JavaScript中每個(gè)函數(shù)都有一個(gè)prototype屬性 在JavaScript中每個(gè)對(duì)象...
摘要:今天閱讀量不大。工具目前還很初級(jí),名為,可以在上找到,各方面都還有待改進(jìn),以支持更多方式。方才確定不是配置的原因。好了,廢話不說(shuō)了,直接上閱讀筆記。方面,國(guó)內(nèi)基本僅此一人。請(qǐng)點(diǎn)擊閱讀原文查看更多,不止這三篇哦晚安 今天閱讀量不大。一則今天的文章確實(shí)不多,跟蹤的 30+ 博客更新不多。二則今天的主要精力在別的事情上。 首先,之前遇到過(guò)一些 CSS 精靈圖的問(wèn)題。同樣的圖標(biāo),切下來(lái)的尺寸卻...
閱讀 1398·2021-09-04 16:40
閱讀 3512·2021-07-28 00:13
閱讀 2944·2019-08-30 11:19
閱讀 2667·2019-08-29 12:29
閱讀 3219·2019-08-29 12:24
閱讀 1169·2019-08-26 13:28
閱讀 2454·2019-08-26 12:01
閱讀 3500·2019-08-26 11:35