字符編碼與python字符串

python字符串與字符編碼

字符編碼

因為計算機只能處理數(shù)字,如果要處理文本,就必須先把文本轉換為數(shù)字才能處理祸穷。最早的計算機在設計時采用8個比特(bit)作為一個字節(jié)(byte)拓提,所以,一個字節(jié)能表示的最大的整數(shù)就是255(二進制11111111=十進制255)鸿吆,如果要表示更大的整數(shù)囤采,就必須用更多的字節(jié)。比如兩個字節(jié)可以表示的最大整數(shù)是65535惩淳,4個字節(jié)可以表示的最大整數(shù)是4294967295蕉毯。但是要處理中文顯然一個字節(jié)是不夠的,至少需要兩個字節(jié)思犁,而且還不能和ASCII編碼沖突代虾,所以,中國制定了GB2312編碼抒倚,用來把中文編進去褐着。加上其他國家也有很多各自的標準,就會不可避免地出現(xiàn)沖突托呕,結果就是含蓉,在多語言混合的文本中,顯示出來會有亂碼项郊。于是就出現(xiàn)了Unicode編碼馅扣,Unicode把所有語言都統(tǒng)一到一套編碼里,這樣就不會再有亂碼問題了着降。
Unicode標準也在不斷發(fā)展差油,但最常用的是用兩個字節(jié)表示一個字符(如果要用到非常偏僻的字符,就需要4個字節(jié))。現(xiàn)代操作系統(tǒng)和大多數(shù)編程語言都直接支持Unicode蓄喇。ASCII編碼和Unicode編碼的區(qū)別:ASCII編碼是1個字節(jié)发侵,而Unicode編碼通常是2個字節(jié)。比如字母A用ASCII編碼是十進制的65妆偏,二進制的01000001刃鳄;字符0用ASCII編碼是十進制的48,二進制的00110000钱骂,注意字符'0'和整數(shù)0是不同的叔锐;漢字 “中” 已經(jīng)超出了ASCII編碼的范圍,用Unicode編碼是十進制的20013见秽,二進制的01001110 00101101愉烙。如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以解取,因此步责,A的Unicode編碼是00000000 01000001吊洼。新的問題又出現(xiàn)了:如果統(tǒng)一成Unicode編碼,亂碼問題從此消失了毛肋。但是原朝,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間玫坛,在存儲和傳輸上就十分不劃算。所以,本著節(jié)約的精神昆码,又出現(xiàn)了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個字節(jié)邻储,常用的英文字母被編碼成1個字節(jié)赋咽,漢字通常是3個字節(jié),只有很生僻的字符才會被編碼成4-6個字節(jié)吨娜。如果你要傳輸?shù)奈谋景罅坑⑽淖址洌肬TF-8編碼就能節(jié)省空間:

字符“A” 的 ASCII、Unicode宦赠、UTF-8 編碼依次是:01000001 陪毡、
00000000 01000001、01000001
字符“中”的ASCII勾扭、Unicode毡琉、UTF-8 編碼依次是:不能表示 、01001110 00101101 妙色、11100100 10111000 10101101

在計算機內(nèi)存中桅滋,統(tǒng)一使用Unicode編碼,當需要保存到硬盤或者需要傳輸?shù)臅r候身辨,就轉換為UTF-8編碼丐谋。

用記事本編輯的時候芍碧,從文件讀取的UTF-8字符被轉換為Unicode字符到內(nèi)存里,編輯完成后号俐,保存的時候再把Unicode轉換為UTF-8保存到文件泌豆。

python字符串

python中字符串是以單引號'或雙引號"括起來的任意文本,請注意萧落,''或""本身只是一種表示方式践美,不是字符串的一部分。字符串也是一種數(shù)據(jù)類型找岖,但是陨倡,字符串比較特殊的是還有一個編碼問題。在最新的Python 3版本中许布,字符串是以Unicode編碼的兴革,也就是說,Python的字符串支持多語言蜜唾。
對于單個字符的編碼杂曲,Python提供了ord()函數(shù)獲取字符的整數(shù)表示,chr()函數(shù)把編碼轉換為對應的字符:

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'

如果知道字符的整數(shù)編碼袁余,還可以用十六進制這么寫str:

>>> '\u4e2d\u6587'
'中文'

由于Python的字符串類型是str擎勘,在內(nèi)存中以Unicode表示,一個字符對應若干個字節(jié)颖榜。如果要在網(wǎng)絡上傳輸棚饵,或者保存到磁盤上,就需要把str變?yōu)橐宰止?jié)為單位的bytes掩完。
Python對bytes類型的數(shù)據(jù)用帶b前綴的單引號或雙引號表示:

x = b'ABC'

要注意區(qū)分'ABC'和b'ABC'噪漾,前者是str,后者雖然內(nèi)容顯示得和前者一樣且蓬,但bytes的每個字符都只占用一個字節(jié)欣硼。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

純英文的str可以用ASCII編碼為bytes恶阴,內(nèi)容是一樣的诈胜,含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼存淫,因為中文編碼的范圍超過了ASCII編碼的范圍耘斩,Python會報錯。
在bytes中桅咆,無法顯示為ASCII字符的字節(jié)括授,用\x##顯示。
反過來,如果我們從網(wǎng)絡或磁盤上讀取了字節(jié)流荚虚,那么讀到的數(shù)據(jù)就是bytes薛夜。要把bytes變?yōu)閟tr,就需要用decode()方法:

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'

如果bytes中包含無法解碼的字節(jié)版述,decode()方法會報錯梯澜,如果bytes中只有一小部分無效的字節(jié),可以傳入errors='ignore'忽略錯誤的字節(jié):

>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte

>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
'中'

由于Python源代碼也是一個文本文件渴析,所以晚伙,當你的源代碼中包含中文的時候,在保存源代碼時俭茧,就需要務必指定保存為UTF-8編碼咆疗。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取母债,我們通常在文件開頭寫上注釋午磁,告訴Python解釋器,按照UTF-8編碼讀取源代碼:

#-*- coding: utf-8 -*-

以上內(nèi)容參考引用自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000

python字符串運算符操作

a = "hello!"
b = "世界!"

#1毡们、根據(jù)下標獲取特定位置字符
print(a[0])  #獲取 a 的第一個字符迅皇,結果h
#2、字符串拼接
c = a+b
d = a*3
print(c)  #結果 hello衙熔!世界登颓!
print(d)  #結果 hello!hello!hello!
#3、切片
e = a[1:3]  #獲取a 中 第二到第三個字符红氯,切片操作中執(zhí)行左閉右開原則挺据,這里即包含1,但不包括3
print(e)   #結果 el
f = d[1:8:2] #切片操作可以加入步長脖隶,這里的2 就是步長,表示獲取d 的2到8位中的偶數(shù)位字符
print(f)  #結果el!e
#4暇检、成員檢測
print("i" in d)  #結果 Flase
print("i" not in d) #結果True
#5  在字符串前加上 r/R 所有的字符串都是直接按照字面的意思來使用,沒有轉義特殊或不能打印的字符产阱。
print(r"\n") #輸出\n,不是換行

python字符串格式化

Python 支持格式化字符串的輸出块仆,最基本的用法是將一個值插入到一個有字符串格式符 %s 的字符串中构蹬。

符號 描述
%c 格式化字符及其ASCII碼
%s 格式化字符串
%d 格式化整數(shù)
%u 格式化無符號整型
%o 格式化無符號八進制數(shù)
%x 格式化無符號十六進制數(shù)
%X 格式化無符號十六進制數(shù)(大寫)
%f 格式化浮點數(shù)字,可指定小數(shù)點后的精度
%e 用科學計數(shù)法格式化浮點數(shù)
%E 作用同%e悔据,用科學計數(shù)法格式化浮點數(shù)
%g %f和%e的簡寫
%G %f 和 %E 的簡寫
%p 用十六進制數(shù)格式化變量的地址
#基本用法
print ("我叫%s今年%d歲!" % ('小明', 10))  #結果我叫小明今年10歲!
#浮點數(shù)格式化
print ("保留兩位小數(shù):%.2f" % (1.2345))  #結果保留兩位小數(shù):1.23
#python3還提供一種格式化輸出方式 用format函數(shù)
print("我叫{0}今年{1}歲!身高{2:.2f}米".format("小明",16,1.72345) ) #結果我叫小明今年16歲!身高1.72米

python字符串內(nèi)建方法

序號 方法 描述
1 capitalize() 將字符串的第一個字符轉換為大寫
2 center(width, fillchar) 返回一個指定的寬度 width 居中的字符串庄敛,fillchar 為填充的字符,默認為空格科汗。
3 count(str, beg= 0,end=len(string)) 返回 str 在 string 里面出現(xiàn)的次數(shù)藻烤,如果 beg 或者 end 指定則返回指定范圍內(nèi) str 出現(xiàn)的次數(shù)
4 bytes.decode(encoding="utf-8", errors="strict") Python3 中沒有 decode 方法,但我們可以使用 bytes 對象的 decode() 方法來解碼給定的 bytes 對象,這個 bytes 對象可以由 str.encode() 來編碼返回怖亭。
5 encode(encoding='UTF-8',errors='strict') 以 encoding 指定的編碼格式編碼字符串涎显,如果出錯默認報一個ValueError 的異常,除非 errors 指定的是'ignore'或者'replace'
6 endswith(suffix, beg=0, end=len(string)) 檢查字符串是否以 obj 結束兴猩,如果beg 或者 end 指定則檢查指定的范圍內(nèi)是否以 obj 結束期吓,如果是,返回 True,否則返回 False.
7 expandtabs(tabsize=8) 把字符串 string 中的 tab 符號轉為空格倾芝,tab 符號默認的空格數(shù)是 8 讨勤。
8 find(str, beg=0 end=len(string)) 檢測 str 是否包含在字符串中,如果指定范圍 beg 和 end 晨另,則檢查是否包含在指定范圍內(nèi)潭千,如果包含返回開始的索引值,否則返回-1
9 index(str, beg=0, end=len(string)) 跟find()方法一樣拯刁,只不過如果str不在字符串中會報一個異常.
10 isalnum() 如果字符串至少有一個字符并且所有字符都是字母或數(shù)字則返 回 True,否則返回 False
11 isalpha() 如果字符串至少有一個字符并且所有字符都是字母則返回 True, 否則返回 False
12 isdigit() 如果字符串只包含數(shù)字則返回 True 否則返回 False..
13 islower() 如果字符串中包含至少一個區(qū)分大小寫的字符脊岳,并且所有這些(區(qū)分大小寫的)字符都是小寫,則返回 True垛玻,否則返回 False
14 isnumeric() 如果字符串中只包含數(shù)字字符割捅,則返回 True,否則返回 False(中文數(shù)字也可以)
15 isspace() 如果字符串中只包含空白帚桩,則返回 True亿驾,否則返回 False.
16 istitle() 如果字符串是標題化的(見 title())則返回 True,否則返回 False
17 isupper() 如果字符串中包含至少一個區(qū)分大小寫的字符账嚎,并且所有這些(區(qū)分大小寫的)字符都是大寫莫瞬,則返回 True,否則返回 False
18 join(seq) 以指定字符串作為分隔符郭蕉,將 seq 中所有的元素(的字符串表示)合并為一個新的字符串
19 len(string) 返回字符串長度
20 ljust(width[, fillchar]) 返回一個原字符串左對齊,并使用 fillchar 填充至長度 width 的新字符串疼邀,fillchar 默認為空格。
21 lower() 轉換字符串中所有大寫字符為小寫.
22 lstrip() 截掉字符串左邊的空格或指定字符召锈。
23 maketrans() 創(chuàng)建字符映射的轉換表旁振,對于接受兩個參數(shù)的最簡單的調(diào)用方式,第一個參數(shù)是字符串涨岁,表示需要轉換的字符拐袜,第二個參數(shù)也是字符串表示轉換的目標。
24 max(str) 返回字符串 str 中最大的字母梢薪。
25 min(str) 返回字符串 str 中最小的字母蹬铺。
26 replace(old, new [, max]) 把 將字符串中的 str1 替換成 str2,如果 max 指定,則替換不超過 max 次秉撇。
27 rfind(str, beg=0,end=len(string)) 類似于 find()函數(shù)甜攀,不過是從右邊開始查找.
28 rindex( str, beg=0, end=len(string)) 類似于 index()秋泄,不過是從右邊開始.
29 rjust(width,[, fillchar]) 返回一個原字符串右對齊,并使用fillchar(默認空格)填充至長度 width 的新字符串
30 rstrip() 刪除字符串字符串末尾的空格.
31 split(str="", num=string.count(str)) num=string.count(str)) 以 str 為分隔符截取字符串,如果 num 有指定值赴邻,則僅截取 num 個子字符串
32 splitlines([keepends]) 按照行('\r', '\r\n', \n')分隔印衔,返回一個包含各行作為元素的列表,如果參數(shù) keepends 為 False姥敛,不包含換行符奸焙,如果為 True,則保留換行符彤敛。
33 startswith(str, beg=0,end=len(string)) 檢查字符串是否是以 obj 開頭与帆,是則返回 True,否則返回 False墨榄。如果beg 和 end 指定值玄糟,則在指定范圍內(nèi)檢查。
34 strip([chars]) 在字符串上執(zhí)行 lstrip()和 rstrip()
35 swapcase() 將字符串中大寫轉換為小寫袄秩,小寫轉換為大寫
36 title() 返回"標題化"的字符串,就是說所有單詞都是以大寫開始阵翎,其余字母均為小寫(見 istitle())
37 translate(table, deletechars="") 根據(jù) str 給出的表(包含 256 個字符)轉換 string 的字符, 要過濾掉的字符放到 deletechars 參數(shù)中
38 upper() 轉換字符串中的小寫字母為大寫
39 zfill (width) 返回長度為 width 的字符串,原字符串右對齊之剧,前面填充0
40 isdecimal() 檢查字符串是否只包含十進制字符郭卫,如果是返回 true,否則返回 false背稼。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贰军,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蟹肘,更是在濱河造成了極大的恐慌词疼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帘腹,死亡現(xiàn)場離奇詭異贰盗,居然都是意外死亡,警方通過查閱死者的電腦和手機阳欲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門童太,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胸完,你說我怎么就攤上這事∏讨” “怎么了赊窥?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狸页。 經(jīng)常有香客問我锨能,道長扯再,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任址遇,我火速辦了婚禮熄阻,結果婚禮上,老公的妹妹穿的比我還像新娘倔约。我一直安慰自己秃殉,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布浸剩。 她就那樣靜靜地躺著钾军,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绢要。 梳的紋絲不亂的頭發(fā)上吏恭,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音重罪,去河邊找鬼樱哼。 笑死,一個胖子當著我的面吹牛剿配,可吹牛的內(nèi)容都是我干的搅幅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惨篱,長吁一口氣:“原來是場噩夢啊……” “哼盏筐!你這毒婦竟也來了?” 一聲冷哼從身側響起砸讳,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琢融,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后簿寂,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漾抬,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年常遂,在試婚紗的時候發(fā)現(xiàn)自己被綠了纳令。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡克胳,死狀恐怖平绩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漠另,我是刑警寧澤捏雌,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站笆搓,受9級特大地震影響性湿,放射性物質(zhì)發(fā)生泄漏纬傲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一肤频、第九天 我趴在偏房一處隱蔽的房頂上張望叹括。 院中可真熱鬧,春花似錦宵荒、人聲如沸汁雷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摔竿。三九已至,卻和暖如春少孝,著一層夾襖步出監(jiān)牢的瞬間继低,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工稍走, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袁翁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓婿脸,卻偏偏與公主長得像粱胜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狐树,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355