關於 Python3 的編碼(walker)

Python3 中 str 與 bytes 的轉換

bytes

字符與 Unicode 編號之間的轉換

  • 字符轉 Unicode 編號
>>> ord('A')
65
>>> hex(ord('A'))
'0x41'

>>> ord('你')
20320
>>> hex(ord('你'))
'0x4f60'

>>> '你好'.encode('unicode_escape')
b'\\u4f60\\u597d'
  • Unicode 編號轉字符
>>> chr(65)
'A'
>>> chr(0x41)
'A'

>>> chr(20320)
'你'
>>> chr(0x4f60)
'你'

>>> b'\\u4f60\\u597d'.decode(('unicode_escape'))
'你好'
>>> print(b'\\u4f60\\u597d')
b'\\u4f60\\u597d'
>>> print(u'\u4f60\u597d')
你好

漢字與 gbk 十六進制/二進制之間的轉換

# 漢字轉十六進制
>>> '你好'.encode('gbk')
b'\xc4\xe3\xba\xc3'

# 十六進制轉漢字
>>> b'\xc4\xe3\xba\xc3'.decode('gbk')
'你好'

# 漢字轉十六進制字符串
>>> ''.join( [ '%02X' % x for x in '你好'.encode('gbk') ] ).strip()
'C4E3BAC3'
>>> ' '.join( [ '%02X' % x for x in '你好'.encode('gbk') ] ).strip()
'C4 E3 BA C3'

# 十六進制字符串轉漢字
>>> bytes.fromhex('C4E3BAC3').decode('gbk')
'你好'
>>> bytes.fromhex('C4 E3 BA C3').decode('gbk')
'你好'

數字與十六進制之間的轉換

# 數字轉十六進制字符串
>>> hex(21)
'0x15'
>>> hex(21)[2:]
'15'

# 十六進制字符串轉數字
>>> int('0x15', 16)
21
>>> int('15', 16)
21

數字與八進制之間的轉換

# 數字轉八進制字符串
>>> oct(21)
'0o25'
>>> oct(21)[2:]
'25'

# 八進制字符串轉數字
>>> int('0o25', 8)
21
>>> int('25', 8)
21

數字與二進制之間的轉換

# 數字轉二進制字符串
>>> bin(5)
'0b101'
>>> bin(5)[2:]
'101'

# 二進制字符串轉數字
>>> int('0b101', 2)
5

>>> int('101', 2)
5

bytes 相關

# bytes 對象轉十六進制字符串
>>> "%02X" % ord(b'\xff')
'FF'
>>>  ''.join(["%02X" % i for i in b'\xe4\xbd\xa0\xe5\xa5\xbd'])
'E4BDA0E5A5BD'

# bytes 轉 int
>>> ord(b'\xff')
255

# int 轉 bytes
>>> bytes([255])
b'\xff'

bit 相關

# 字符串轉 01 串(默認 endian 是大端)
>>> arr = bitarray()
>>> arr.frombytes('你好'.encode('utf8'))
>>> arr.to01()
'111001001011110110100000111001011010010110111101'

# 01 串轉字符串
>>> bitarray('111001001011110110100000111001011010010110111101').tobytes().decode('utf8')
'你好'

關於 utf8 的 bom 頭

>>> import codecs
>>> codecs.BOM_UTF8
b'\xef\xbb\xbf'
>>> len(b'\xef\xbb\xbf')
3
>>> codecs.BOM_UTF8.decode('utf8')
'\ufeff'
>>> len('\ufeff')
1

Python3 內置編碼

>>> from encodings.aliases import aliases
>>> for k in aliases:
    print('%s: %s' % (k, aliases[k]))
  • 驗證是否是有效編碼
>>> import codecs

>>> codecs.lookup('utf8')    #有效
<codecs.CodecInfo object for encoding utf-8 at 0x13fb4f50828>

>>> codecs.lookup('utf-;8')    #有效
<codecs.CodecInfo object for encoding utf-8 at 0x13fb4f50a08>

>>> codecs.lookup('utf88')    #無效
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    codecs.lookup('utf88')
LookupError: unknown encoding: utf88
  • 標準化 encoding
>>> import encodings
>>> encodings.normalize_encoding('utf-;8')
'utf_8'

對應 C 代碼爲:unicodeobject.c中的 __Py_normalize_encoding_函數。html

import sys
import locale
 
# 當前系統所使用的默認字符編碼
>>> sys.getdefaultencoding()
'utf-8'
 
# 用於轉換 Unicode 文件名至系統文件名所使用的編碼
>>> sys.getfilesystemencoding()
'utf-8'
 
# 獲取默認的區域設置並返回元組(語言, 編碼)
>>> locale.getdefaultlocale()
('zh_CN', 'cp936')
 
# 返回用戶設定的文本數據編碼
# 文檔提到this function only returns a guess
>>> locale.getpreferredencoding()
'cp936'

字符串反轉

>>> line = '0123456789'
>>> line[::-1]
'9876543210'
本文出自 walker snapshot
相關文章
相關標籤/搜索