python3 編碼問題bytes/encode 和str/decode


''' 編碼的問題 python2解釋器在加載.py文件中的代碼時,會對內容進行編碼(默認ascii),而python3對內容進行編碼的默認為utf-8。 計算機: 早期,計算機是美國發明的,普及率不高,一般只是在美國使用,所以,最早的編碼結構就是按照美國人的習慣來編碼的。 對應數字+字母+特殊字符一共也沒多少,所以就形成了最早的編碼ASCII碼,直到今天ASCII依然深深的影響着我們。 ASCII(American Standard Code for Information Interchange,美國標准信息交換代碼)是基於拉丁字母的一套電腦編碼系統。 主要用於顯示現代英語和其他西歐語言,其最多只能用8位來表示(一個字節),即:2**8 = 256,所以, ASCII碼最多只能表示 256個字符。 隨着計算機的發展,一級普及率的提高,流行到歐洲和亞洲。這時ASCII碼就不合適了,比如:中文漢字有幾萬個,而ASCII最多 也就256個位置,所以ASCII不行了,怎么辦呢?這時,不同的國家就提出了不同的編碼用來適用於各自的語言環境,比如,中國的GBK, GB2312,BIG5,ISO-8859-1等等。這時各個國家都可以使用計算機了。 GBK,國標碼占用2個字符,對應ASCII碼GBK直接兼容。因為計算機底層是用英文寫的,你不支持英文肯定不行,而英文已經使用了 ASCII碼,所以GBK要兼容ASCII。 這里GBK國標碼,前面的ASCII碼部分,由於使用兩個字節,所以對於ASCII碼而言,前9位都是0。 國標碼的弊端,只能中國用,日本就垮了,所以國標碼不滿足我們的使用。這時提出了一個萬國碼Unicode。Unicode一開始設計是 每個字符兩個字節,設計完了,發現中國漢字依然無法金鄉編碼,只能進行擴充,擴充成32位也就是4個字節,這回夠了。但是, 問題來了,中國字9萬多,而unicode可以表示40多億,根本用不了,太浪費了,於是乎,就提出了新的UTF編碼。可邊長度編碼。 UTF-8:每個字符最少占8位,每個字符占用的字節數不定,根據文字內容進行具體編碼,比如,英文,就一個字節就夠了,漢字占3個字節。 這時即滿足了中文,也滿足了節約。也是目前使用頻率最高的一種編碼。 GBK:每個字符占2個字節,16位。 結論: 1.ascii:8bit,主要存放的是英文,數字,特殊符號。 2.gbk:16bit,主要存放中文和亞洲字符,兼容ascii。 3.unicode:16bit和32bit兩個版本。平時我們用的16bit這個版本,全世界所有國家的文字信息,缺點:浪費空間(傳輸和存儲) 4.utf-8:可變長度unicode,英文:8bit,歐洲文字:16bit,中文24bit。一般數據傳輸和存儲的時候使用。 ''' str1 = "中國"
print(str1.encode("utf-8"))  # b'\xe4\xb8\xad\xe5\x9b\xbd'
print(b'\xe4\xb8\xad\xe5\x9b\xbd'.decode("utf-8"))  # 中國

print(str1.encode("gbk"))  # b'\xd6\xd0\xb9\xfa'
print(b'\xd6\xd0\xb9\xfa'.decode("gbk"))  # 中國

''' 總結:一個中文在utf-8編碼中占用3個字節,在gbk編碼中占用2個字節 ''' with open("a1.txt", mode="w", encoding="utf-8") as f: f.write("中國") with open("a2.txt", mode="wb") as f: f.write("中國".encode("utf-8")) ''' 兩種不同的寫文件的模式,效果是一樣的。 '''

print("中國".encode("utf-8"))  # b'\xe4\xb8\xad\xe5\x9b\xbd'
print(bytes("中國", encoding="utf-8"))  # b'\xe4\xb8\xad\xe5\x9b\xbd'
print("中國".encode("utf-8") == bytes("中國", encoding="utf-8"))  # True

''' 總結:字符串轉字節,可以使用encode()函數,也可以使用bytes()函數。 ''' bytes1 = "中國".encode("utf-8") bytes2 = bytes("中國", encoding="utf-8") print(bytes1)  # b'\xe4\xb8\xad\xe5\x9b\xbd'
print(bytes2)  # b'\xe4\xb8\xad\xe5\x9b\xbd'
print(bytes1.decode("utf-8"))  # 中國
print(str(bytes1, encoding="utf-8"))  # 中國

''' 總結:字節轉字符串,可以使用str()函數,也可以使用decode()函數。 '''

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM