python學習-字符和編碼

參考:廖雪峯官網https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896app

1、ASCII、Unicode、UTF-8的由來和關係學習

一、由來:由於計算機只識別數字,因此計算機的發明國家美國對大小寫英文字母、數字以及一些特殊符號進行了編碼,共127個,即ASCII編碼表。優化

二、發展:由於ASCII編碼不支持中文,因此中國製定了GB1312編碼,韓國製定了Euc-kr、日本製定了Shift-JIS...編碼

三、整合:世界上有上百種語言,使用各自的編碼最終的結果就是亂碼。所以Unicode編碼出現了,Unicode支持全部的語言。也是計算機使用的編碼。spa

四、優化:Unicode雖然支持全部的語言,解決了亂碼問題,可是也有不足。不管是英文、中文字符,在Unicode編碼下所佔的存儲空間都是2個字節(1個字節=8個比特,也就是十進制的255,二進制的11111111),而實際上,英文字符僅須要1個字節的存儲空間,Unicode採起的方式是在二進制前填充0。例如:3d

字符"A"在ASCII編碼中是65,二進制表示是1000001,而使用Unicode則表示爲:00000000 01000001。這樣,至關於佔用了2個字節的存儲空間。因此,utf-8出現了。utf-8把字符按不一樣的大小編碼成1-6個字節,英文通常是1個,中文是3個字節,個別生闢字佔用4-6個。code

五、注意:計算機內存中統一使用Unicode,當須要保存到硬盤或者輸出時,則轉化爲UTF-8。orm

2、學習blog

一、Unicode的ord()和chr()方法,#號後爲輸出。遞歸

ord("A") #65
ord("1") #49
ord("a") #97
ord("")#20013
chr(65) #A
chr(20013) #

 

二、字符轉二進制

name = "中文"
for i in name:
    j = bytes(i,encoding = "utf-8")    #將字符轉換爲字節
    print("字符\"%s\"用二進制輸出爲:"%i)
    for m in j:
        n = bin(m)    #字節轉爲二進制
        print(n,end = " ") #以空格結尾
    print()

 

三、十進制轉二進制

l = []
num =19
def a(num):
    if num < 0 :
        return "-"+a(abs(num))    #若是數字小於0,則在二進制數前添加負號返回,abs()返回絕對值
    while True:
        num,r = divmod(num,2)    #返回結果:num/2,num%2 = divmod(num,2),以19爲例,依次返回結果(9,1)(4,1)(2,0)(1,0)(0,1),則r的值依次爲11001,num=0時,循環結束。
        l.append(str(r))    #l列表依次追加11001,l = ["1","1","0","0","1"]
        print(l)  
        if num == 0:
            return "".join(l[::-1])  #l[::-1]是使用切片,::1將列表分紅1等份,::2將列表分紅2等份(奇數向上取整,例如5取3),加上負號就是倒置。::-1實際就是將列表倒置了。
                       #Python join() 方法用於將序列中的元素以指定的字符鏈接生成一個新的字符串。也就是把倒置後的列表["1","0","0","1","1"]的5個字符生成爲"10011"並返回。

四、對數字進行36進制內的轉換

#網上copy的案例,分析下
def
baseN(num, b): return ((num == 0) and "0") or \  # (1)當num==0和"0",則直接返回0%b;(2)遞歸出口
 (baseN(num // b, b).lstrip("0") +\  #num != 0,則傳入(num//b,b)繼續調用baseN(),lstrip("0"),是去掉字符串內首個字符串的0字符。例如"00aa0 0xxa"使用方法後爲"aa0 0xxa"
"0123456789abcdefghijklmnopqrstuvwxyz"[num % b]) #每次調用拼接取餘值[num%b],"0123456789abcdefghijklmnopqrstuvwxyz"指定了[num%b]的取值範圍,在本案例中
                                 #其實能夠寫爲"01"[num%b],由於計算機轉化爲進制後只有0和1。
baseN(2,16)

五、佔位符%和format()的使用

#佔位符,等同於format()
print("%2d-%03d"%(3,10)) 
# 3-010 
#3前面有空格,由於未指定補充值
print("%3d-%03d"%(3,10)) 
#           3-010
#  %3d,在值前面生成2個空格
#  %03d,在個十位數前面填充0,顯示爲3位數
print("%d-%d"%(3,1))
#3-1
print("%.1f"%3)    #.1f就是保留小數點後1位,同理.2f就是保留兩位
#3.0
print("%d%%"%7)  # %d是保留整數,%%顯示爲%
#7%

六、轉義符\和r

#轉義符\,在單引號或者雙引號內須要使用引號時,在引號前添加轉義符\
print('I\'m \"zhangchun1\"')
# I'm "zhangchun1"
print("I\'m \"zhangchun\"")
# I'm "zhangchun"
# \n與\t 表明換行和製表符,
print("I\'m \n\"zhangchun\"")
print("I\'m \t\"zhangchun\"")
# I'm 
# "zhangchun"
# I'm     "zhangchun"
#轉義r,使用r時,則""內部默認不轉義
print(r"I\'m \t\"zhangchun\"")
# I\'m \t\"zhangchun\"
相關文章
相關標籤/搜索