關於 Python3 的編碼

wKiom1mIEXfReh9TAAA5ATqexB8639.png

  • 字符與 Unicode 編號之間的轉換python

# 字符轉 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 十六進制(二進制)之間的轉換。
    shell

# 漢字轉十六進制
>>> '你好'.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')
'你好'
  • 數字與十六進制(二進制)之間的轉換ide

# 數字轉十六進制字符串
>>> 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 相關(需使用第三方包 bitarraythis

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

# 01 串轉字符串
>>> bitarray('111001001011110110100000111001011010010110111101').tobytes().decode('utf8')
'你好'
  • 關於utf8的bom頭。(Python3下)編碼

>>> import codecs
>>> codecs.BOM_UTF8
b'\xef\xbb\xbf'
>>> len(b'\xef\xbb\xbf')
3
>>> codecs.BOM_UTF8.decode('utf8')
'\ufeff'
>>> len('\ufeff')
1
>>> from encodings.aliases import aliases
>>> for k in aliases:
	print('%s: %s' % (k, aliases[k]))
  • 驗證是否是有效編碼。code

>>> 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 函數。

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 ***

相關文章
相關標籤/搜索