首頁 > 軟體

python中的編碼和解碼及\x和\u問題

2022-05-20 13:12:15

編碼和解碼及x和u問題

“字元在記憶體裡的表示是unicode,如果要存檔或者發到網路就經過utf-8,然後對端收到依次解碼。”

Python 3裡面,str在記憶體裡是unicode表示的

‘中文’ == ‘u4e2du6587’

'中文'.encode('utf-8')
b'xe4xb8xadxe6x96x87'
 'u4e2du6587'.encode('utf-8')
b'xe4xb8xadxe6x96x87'

1個漢字用unicode表示一般是2個byte,

例如:

‘中’=u4e2d(十六進位制寫法【即2bytes】)

'A'.encode('ascii')
>>>b'A'
('u0041').encode('ascii')
>>>b'A'
'A'.encode('utf-8')
>>>b'A'

note: b’A’和’A’

在python 3中

b’A’是ascii編碼的01010101的位元組,佔1個byte;

'A‘是在記憶體裡按unicode形式編碼的/ucc,佔的是2個byte。

unicode編碼後是bytes,如果這個位元組範圍不在ascii的表示範圍內,就會顯示成x(十六進位制形式)

例如:

  • 漢字編碼成bytes,去檢視這個bytes肯定只能看到x系列,因為這個bytes的內容肯定不在ascii範圍內;
  • 英文編碼成bytes可以看到對應的英文字母,本質上它還是沒有含義的010101的位元組流而不是字元。
"abc".encode('utf-8')
b'abc'
'中文'.encode('utf-8')
b'xe4xb8xadxe6x96x87'
1個漢字,按utf-8編碼,一般是3個bytes,xe4是十六進位製表示的1個byte。

相同的英文字元,ascii編碼和utf-8編碼的結果是一致的,因為這兩種編碼都使用一個byte表示一個英文字元

'abc'.encode('ascii').decode('utf-8')
'abc'

可以用一個編碼然後再另一個解碼,是可以成功還原的。但一般是不會這麼做的。

ord函數獲取字元的整數表示和chr數把編碼轉換為對應的字元

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

對str和對bytes用len,意義是不同的。

len(str)統計字元數,len(bytes)統計bytes數

>>> len('中文')
2
 len(str)統計字元數
>>> bt1 = '中文'.encode('gb2312')
>>> bt2 = '中文'.encode('utf-8')
>>> bt1
b'xd6xd0xcexc4'
>>> bt2
b'xe4xb8xadxe6x96x87'
>>> len(bt1)
4
>>> len(bt2)
6

以Unicode表示的str通過encode()方法可以編碼為指定的bytes

python解析 x 和 u "亂碼"

引數錯誤

xe5x8fx82xe6x95xb0xe6x9cx89xe8xafxaf  

今日已經完成過此任務,請明日再做此任務吧!

u4ecau65e5u5df2u7ecfu5b8cu6210u8fc7u6b64u4efbu52a1uff0cu8bf7u660eu65e5u518du505au6b64u4efbu52a1u5427!

python2.7解析方法

>>> print(u'xe5x8fx82xe6x95xb0xe6x9cx89xe8xafxaf  '.encode('unicode_escape').decode('string_escape')) 
>>>print('u4ecau65e5u5df2u7ecfu5b8cu6210u8fc7u6b64u4efbu52a1uff0cu8bf7u660eu65e5u518du505au6b64u4efbu52a1u5427!'.decode('unicode_escape'))

python3解析方法

>>>('xe5x8fx82xe6x95xb0xe6x9cx89xe8xafxaf  '.encode('raw_unicode_escape')).decode()
>>>'u4ecau65e5u5df2u7ecfu5b8cu6210u8fc7u6b64u4efbu52a1uff0cu8bf7u660eu65e5u518du505au6b64u4efbu52a1u5427!'

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com