Python3 中 str 与 bytes 的转换:The bytes/str dichotomy in Python 3
字符与 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 相关(需使用第三方包 bitarray)
# 字符串转 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
Python3 有哪些编码:Standard Encodings、Python Specific Encodings 。
打印编码及别名。(Get a list of all the encodings Python can encode to)
>>> from encodings.aliases import aliases >>> for k in aliases: print('%s: %s' % (k, aliases[k]))
验证是不是有效编码。
>>> import codecs >>> codecs.lookup('utf8') #有效>>> codecs.lookup('utf-;8') #有效 >>> codecs.lookup('utf88') #无效 Traceback (most recent call last): File " ", line 1, in codecs.lookup('utf88') LookupError: unknown encoding: utf88
标准化 encoding。
>>> import encodings >>> encodings.normalize_encoding('utf-;8') 'utf_8'
对应 C 代码为:unicodeobject.c 中的 _Py_normalize_encoding 函数。
sys/locale 模块中与编码相关的方法。(Python字符编码详解)
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'
【相关阅读】
Unicode Tips
Python3 处理 gb18030 乱码
*** walker ***