编码 | 大小 | 支持语言 |
---|---|---|
ASCII | 1个字节 | 英文 |
Unicode | 2个字节(生僻字4个) | 所有语言 |
UTF-8 | 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 | 所有语言 |
py2编码:包含2种类型str和unicode, str相当于bytes, unicode 相当于str
python 2默认编码为ASCII,所以出现中文时会出现报错,那是一位ASCII没有包括中文。
# 解决方法一: import sys reload(sys) sys.setdefaultencoding('utf-8') # 解决方法二: #coding:utf8 # 解决方法三: #-*- coding:utf-8 -*-
str是unicode这个字符串经过编码(utf8,gbk等)后的字节组成的序列,unicode才是真正意义上的字符串
#str格式 >>> a='高兴' >>> a '\xe9\xab\x98\xe5\x85\xb4' #unicode >>> a=u'高兴' >>> a u'\u9ad8\u5174'
#Python 2 悄悄掩盖掉了 byte 到 unicode 的转换,让程序在处理 ASCII 的时候更加简单 >>> print(u'nihao'+'gaoxing') nihaogaoxing #在处理非ASSII内的字符相加时,会出现UnicodeDecodeError >>> print(u'nihao'+'高兴') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)
unicode 和str 转换,
py3编码:包含str和byte , “str” 类型存储的是一个 unicode, “bytes” 类型存储的是 byte,也可以通过一个 b 前缀来制造 byte
python 3默认编码为UTF-8
Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,
py3时:
a="中国" 和a=u"中国" 是一个意思,都表示str类型unicode存储类型
c=b"good" 表示str类型bytes存储类型
py2时:
a="中国" 和a=b"中国" 是一个意思,表示str类型bytes存储类型
a=u"中国" 表示str类型unicode存储类型