當前位置:首頁 » 編程語言 » pythonutf轉ascii

pythonutf轉ascii

發布時間: 2023-08-31 00:40:39

python 字元集編碼 - UTF-8 編碼

Unicode 的編碼范圍為 0~0x10FFFF ,如此大的范圍,顯然沒辦法像 ASCII 編碼一樣使用一個位元組存儲。為此,Unicode 制定了各種儲存編碼的方式,如: UTF-8 、 UTF-16 和 UTF-32 ,這些存儲格式被稱為 Unicode 轉換格式 UTF 。

每種 Unicode 轉換格式都會把一個編碼存儲為一到多個編碼單元,如 UTF-8 的編碼單元為 8 位的位元組; UTF-16 的編碼單元為 16 位,即 2 個位元組; UTF-32 的編碼單元為 32 位,即 4 個位元組。

其中, UTF-8 是在互聯網上使用最廣泛的一種 Unicode 轉換格式,具有以下顯著的優勢。下面,我們就先來看看 UTF-8 具有哪些有點吧~

1. UTF-8 中每個 ASCII 字元只需要一個位元組去存儲,因此一個 ASCII 文本本身也是一個 UTF-8 文本,即做到了向後兼容。

比如 A 的 ASCII 碼對應為 0x41 , a 的 ASCII 碼對應為 0x61 ,那麼 UTF-8 兼容 ASCII 也就意味著:

這里,需要再次提醒一下:Unicode 是表現形式,UTF-8 是存儲形式;即 UTF-8 解碼之後為 Unicode ,Unicode 可以編碼成 UTF-8 。

2. UTF-8 採用位元組為存儲單元,因此不存在位元組的大端和小段的問題。

UTF-16 和 UTF-32 的存儲單元分別是 2 位元組和 4 位元組,因此在存儲時會涉及到大小端的問題。那什麼是大小端模式呢?下面我們來暫停補充一下~

關於如何獲知你的環境使用的是大端模式還是小端模式,這里有個簡單的方式:定義一個 short 類型的數組即可:

數字 1 在 short 類型中表示為 0x0001 ,高位為 0x00 ,低位為 0x01 。我們可以很直觀地看到,數組在保存數據時,將高位 0x00 放在了高地址處,將低位 0x01 放在了低地址處。因此使用的就是小端模式。

那 UTF-8 為什麼可以使用位元組來作為存儲單元,而不用擔心位元組序的問題呢?這就涉及到了 UTF-8 巧妙的編碼規則~

UTF-8 最大的一個特點,就是它是一種變長的編碼方式。它可以使用 1~4 個位元組表示一個符號,根據不同的符號而變化位元組長度。UTF-8的編碼規則很簡單,只有二條:

1)對於單位元組符號,位元組的第一位設為 0 ,後 7 位為這個符號的 Unicode 碼。也就是我們上文提到的向後兼容:對於英文字母,UTF-8 編碼和 ASCII 碼是相同的。

2)對於使用 X 個位元組存儲的符號,第一個位元組的前 X 位設置為 1 ,第 X+1 位設置為 0 ,後面位元組的前 2 位一律設置為 10 ,剩下的位置一次填充這個符號的 Unicode 碼。

下表總結了編碼規則,字母 x 表示可用於編碼的位:

跟據上表,解讀 UTF-8 編碼也非常簡單:如果一個位元組的第一位是 0 ,則這個位元組單獨就是一個字元;如果第一位是 1 ,則連續有多少個 1 ,就表示當前字元佔用多少個位元組。

下面,我們就來演示一下 UTF-8 編碼的過程。

首先,獲取漢字 魚 的 Unicode 碼:

我們不妨先對 魚 這個漢字使用 utf-8 編碼看看使用幾個位元組存儲:

魚 在 UTF-8 編碼中使用 3 個位元組存儲,因此其存儲的二進制的形式為 1110xxxx 10xxxxxx 10xxxxxx ,將 Unicode 1001 110001 111100 依次填充到佔位符 x 的位置就得到: 11101001 10110001 10111100 。

下面,我們將上述推導得出的 11101001 10110001 10111100 轉換為十六進制,驗證一下是否為 b'xe9xb1xbc' :

驗證無誤!

② python3.4 編碼有哪些

Python3中的編碼問題前,第一個段落對位元組、ASCII與Unicode與UTF-8等進行基本介紹,如果不對這幾種編碼犯頭暈,可直接跳過。
ASCII與Unicode與UTF-8與GBK

首先從老大哥說起。跟很多人一樣,大學讀了這么久,久仰ASCII編碼的大名。要說這個老大哥,我們再先從位元組說起。一個位元組包括八個比特位,每個比特位表示0或1,一個位元組即可表示從00000000到11111111共2^8=256個數字。一個ASCII編碼使用一個位元組(除去位元組的最高位作為作奇偶校驗位),ASCII編碼實際使用一個位元組中的7個比特位來表示字元,共可表示2^7=128個字元。比如那時寫C語言的程序,就經常要背下ASCII編碼中的01000001(即十進制的65)表示字元『A』,01000001加上32之後的01100001(即十進制的97)表示字元『a』。現在打開Python,調用chr和ord函數,我們可以看到Python為我們對ASCII編碼進行了轉換。

第一個00000000表示空字元,因此ASCII編碼實際上只包括了
字母、標點符號、特殊符號等共127個字元。因為ASCII是在美國出生的,對於由字母組成單詞進而用單詞表達的英文來說也是夠了。但是中國人、日本人、
韓國人等其他語言的人不服了。中文是一個字一個字,ASCII編碼用上了渾身解數256個字元都不夠用。

因此後來出現了Unicode編碼。Unicode編碼通常由兩個位元組組成,共表示256*256個字元,即所謂的UCS-2。某些偏僻字還會用到四個位元組,即所謂的UCS-4。也就是說Unicode標准也還在發展。但UCS-4出現的比較少,我們先記住:最原始的ASCII編碼使用一個位元組編碼,但由於語言差異字元眾多,人們用上了兩個位元組,出現了統一的、囊括多國語言的Unicode編碼。

在Unicode中,原本ASCII中的127個字元只需在前面補一個全零的位元組即可,比如前文談到的字元『a』:01100001,在Unicode中變成了00000000 01100001。不久,美國人不開心了,吃上了世界民族之林的大鍋飯,原本只需一個位元組就能傳輸的英文現在變成兩個位元組,非常浪費存儲空間和傳輸速度。

人們再發揮聰明才智,於是出現了UTF-8編碼。因為針對的是空間浪費問題,因此這種UTF-8編碼是可變長短的,從英文字母的一個位元組,到中文的通常的三個位元組,再到某些生僻字的六個位元組。解決了空間問題,UTF-8編碼還有一個神奇的附加功能,那就是兼容了老大哥的ASCII編碼。一些老古董軟體現在在UTF-8編碼中可以繼續工作。

注意除了英文字母相同,漢字在Unicode編碼和UTF-8編碼中通常是不同的。比如漢字的『中』字在Unicode中是01001110
00101101,而在UTF-8編碼中是11100100 10111000
10101101。

我們祖國母親自然也有自己的一套標准。那就是GB2312和GBK。當然現在挺少看到。通常都是直接使用UTF-8。記得我唯一一次看到GB編碼的網頁,是一個成人網站。

Python3中的默認編碼

Python3中默認是UTF-8,我們通過以下代碼:

import sys

sys.getdefaultencoding()

可查看Python3的默認編碼。

Python3中的encode和decode

Python3中字元編碼經常會使用到decode和encode函數。特別是在抓取網頁中,這兩個函數用的熟練非常有好處。我的理解,encode的作用,使我們看到的直觀的字元轉換成計算機內的位元組形式。decode剛好相反,把位元組形式的字元轉換成我們看的懂的、直觀的、「人模人樣」的形式。如下圖。

\x表示後面是十六進制,\xe4\xb8\xad即是二進制的11100100 10111000
10101101。也就是說漢字『中』encode成位元組形式,是11100100 10111000
10101101。同理,我們拿11100100
10111000 10101101也就是\xe4\xb8\xad來decode回來,就是漢字『中』。完整的應該是b'\xe4\xb8\xad',在Python3中,以位元組形式表示的字元串則必須加上前綴b,也就是寫成上文的b'xxxx'形式。

前文說的Python3的默認編碼是UTF-8,所以我們可以看到,Python處理這些字元的時候是以UTF-8來處理的。因此從上圖可以看到,就算我們通過encode('utf-8')特意把字元encode為UTF-8編碼,出來的結果還是相同:b'\xe4\xb8\xad'。

明白了這一點,同時我們知道UTF-8兼容ASCII,我們可以猜想大學時經常背誦的『A』對應ASCII中的65,在這里是不是也能正確的decode出來呢。十進制的65轉換成十六進制是41,我們嘗試下:

b'\x41'.decode()

結果如下。果然是字元『A』

Python3中的編碼轉換

據說字元在計算機的內存中統一是以Unicode編碼的。只有在字元要被寫進文件、存進硬碟或者從伺服器發送至客戶端(例如網頁前端的代碼)時會變成utf-8。但其實我比較關心怎麼把這些字元以Unicode的位元組形式表現出來,露出它在內存中的廬山正面目的。這里有個照妖鏡:

xxxx.encode/decode('unicode-escape')

輸出如下

b'\\u4e2d'還是b'\u4e2d,一個斜杠貌似沒影響。同時可以發現在shell窗口中,直接輸'\u4e2d'和輸入b'\u4e2d'.decode('unicode-escape')是相同的,都會列印出漢字『中』,反而是'\u4e2d'.decode('unicode-escape')會報錯。說明說明Python3不僅支持Unicode,而且一個『\uxxxx』格式的Unicode字元可被辨識且被等價於str類型。

如果我們知道一個Unicode位元組碼,怎麼變成UTF-8的位元組碼呢。懂了以上這些,現在我們就有思路了,先decode,再encode。代碼如下:

xxx.decode('unicode-escape').encode()

測試如下:

可以看到最後輸出的UTF-8位元組與上面的相同。嘗試成功。所以其他的編碼之間的轉換,大概也是如此。

最後的擴展

還記得剛剛那個ord嗎。時代變遷,老大哥ASCII被人合並,但ord還是有用武之地。試試ord('中'),輸出結果是20013。20013是什麼呢,我們再試試hex(ord('中')),輸出結果是'0x4e2d',也就是20013是我們在上文見面了無數次的x4e2d的十進制值。這里說下hex,是用來轉換成十六進制的函數,學過單片機的人對hex肯定不會陌生。

最後的擴展,在網上看到的他人的問題。我們寫下類似於'\u4e2d'的字元,Python3知道我們想表達什麼。但是讓Python讀取某個文件的時候出現了'\u4e2d',是不是計算機就不認識它了呢?後來下文有人給出了答案。如下:

import codecs

file = codecs.open( "a.txt", "r", "unicode-escape" )

u = file.read()

print(u)

③ python 將英文字母轉成對應的ASCII數字

1、創建python文件,testascii.py;

④ Python ascii 編碼 怎麼轉化為utf-8編碼

實現代碼如下:

a='abce'
#printtype(a)
b=a.decode("ascii")
#printtype(b)
c=a.decode("ascii").encode("utf-8")
#printtype(c)


在python中進行編碼轉換都是通過unicode作為中間值實現的。所以要先decode成unicode字元,然後再使用encode轉換成utf-8編碼的str。可以把注釋取消了,看下轉換過程中的類型。

⑤ python中,將中文放到列表中會變成ascii碼,怎麼直接將中文轉為ascii碼

將中文放到列表中會變成ascii會變成ascii啊,禪逗為什麼要這么做呢,ascii不能描述中文,你可以用unicode,比如「中國」,u"中國"敗肢就是unicode, 真正的值是:賀枯賣u'\u4e2d\u56fd'

⑥ python編碼轉換:ascii和GB2312的問題

供參考。gb312本來就是標准ascii的一種擴充,ascii可以視同為gb312的子集。所以,如果var的值全部是在ascii裡面的話,轉成gb312後也還是屬於ascii,所以使用detect函數的時候,編碼還是ascii(當然同時也屬於gb312);如果var的值不是全部在ascii裡面的話,語句var = var.decode('ascii')可能會出錯。
只要var的值是英文(內碼0-127),轉換不轉換,都已經是gb2312編碼。

⑦ Python字元編碼使用什麼碼

Python 2.x 和 Python 3.x 的字元編碼存在較大的區別。下面將分別介紹它們的編碼原理及相關內容。

Python 2.x 字元編碼

在 Python 2.x 中,str 類型默認使用 ASCII 編碼。ASCII 編碼是在 1960 年代初開發的一種編碼方式,用於將英文字母、數字、符號等字元表示為位元組。由於 ASCII 編碼只使用了 7 位二進制數,因此只能表示 128 種字元。

當需要使用非 ASCII 字元時,在 str 類型前添加 u 前綴,即可將字元串轉換為 Unicode 類型,如下所示:

str1 = 'hello' # 默認使用 ASCII 編碼

str2 = u'你好' # 使用 Unicode 編碼

Python 3.x 字元編碼

在 Python 3.x 中,str 類型默認使用 Unicode 編碼,即 Python 2.x 中的 Unicode 類型。Unicode 編碼是一種支持全球范圍內的字元集,褲歲正能夠表示幾乎所有語言的字元,包括漢字、日文、希臘字母等。

為了支持位元組和 Unicode 類型之間的轉換,Python3.x 新增了 bytes 類型。bytes 類型與 str 類型的區別在於,bytes 類型會自動將字元串轉雀猛換成位元組,而 str 類型會自動將位元組轉換成字元串。

bytes 類型使用 b 前綴表示,如下所示:

str1 = 'hello' # 默認使用胡悔 Unicode 編碼,即 Python 2.x 中的 Unicode 類型

str2 = b'hello' # 使用 bytes 類型

編碼原理及注意事項

  • 字元編碼的原理在於將字元轉換為二進製表示,以便計算機能夠處理。

  • ASCII 編碼使用 7 位二進制數對字元進行編碼,而 Unicode 編碼使用 16 位或 32 位二進制數對字元進行編碼。

  • 在 Python 中,可以使用 encode 方法將 Unicode 字元串轉換為位元組類型,使用 decode 方法將位元組類型轉換為 Unicode 字元串。編碼方式有多種,如 UTF-8、GBK、Unicode 等,需要根據實際業務需求進行選擇。

  • UTF-8 編碼是一種常用的 Unicode 字元編碼方式,它使用變長位元組對字元進行編碼,能夠表示幾乎所有的字元。GBK 編碼是一種用於漢字編碼的字元集,只能表示中文字元。

  • Python 3.x 默認使用 UTF-8 編碼,因此在讀取文件或進行網路傳輸時,需要明確指定編碼方式以避免出現亂碼等問題。

總結

由於字元編碼十分復雜,涉及到的知識點較多,因此學習時需要耐心且注意細節。在使用 Python 進行編程時,需要根據實際情況選擇合適的編碼方式,以避免出現亂碼等問題。

希望我的回答能夠對您有所幫助!

熱點內容
外賣盒子如何設置密碼 發布:2025-02-04 05:49:33 瀏覽:504
國產安卓編程軟體哪個最好 發布:2025-02-04 05:49:25 瀏覽:387
什麼是身份證密碼 發布:2025-02-04 05:43:41 瀏覽:784
雲伺服器江蘇 發布:2025-02-04 05:38:46 瀏覽:237
演算法及vb 發布:2025-02-04 05:33:37 瀏覽:102
安卓手機怎麼自檢電池 發布:2025-02-04 05:31:31 瀏覽:410
兩種存儲 發布:2025-02-04 05:26:43 瀏覽:203
手機php源碼 發布:2025-02-04 05:08:22 瀏覽:548
全戰帝國與拿戰哪個配置高 發布:2025-02-04 04:59:39 瀏覽:754
海控聯盟怎麼下載安卓版 發布:2025-02-04 04:55:52 瀏覽:768