format函数中间 需要转换成左边一致的编码 unicode或者其他编码(文件开头使用 #utf-8 则是utf-8)
内部encode 和decode函数 参数默认是 ascii (这样转换肯定报错)
+ 符号要求左右同一种编码
>>> '中{0}'.format(b)
'\xe4\xb8\xad\xe5\x9b\xbd‘ =utf-8编码(是文件中变量的默认编码)
u'中{0}'.format(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
默认调用b.decode('ascii')
>>u'中{0}'.format(b.decode('utf-8'))
u'\u4e2d\u56fd' = unicode内部编码 (unicode编码的 utf-32存储编码直接转换为十六进制数)
'中{0}'.format(b.decode('utf-8')) 最终会encode('ascii) 对于国汉字
内部默认使用ascii处理字符
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u56fd' in position 0: ordinal not in range(128)
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> '中{0}'.format(b.decode('utf-8')) (最终会赋值个
'\xe4\xb8\xad\xe5\x9b\xbd'
sys.getdefaultencoding() 默认返回 ascii 这个是python内部默认编码 不等于文件开头的 # -*- coding: utf-8 -*- 设置的文件编码
可以通过 reload sys.setdfaultencoding('utf-8') 修改
# -*- coding: utf-8 -*- 会使得文件中的字符串编码方式为utf-8 (主要是unicode对象的编码方式)
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
UnicodeEncodeError: 'ascii' codec can't encode character u'\u4e2d' in position 0: ordinal not in range(128) 错误总结
示例
a=1
b=2
c="{0} {1}“.format(a,b)//ok
c=u"{0} {1}".format(a,b) //ok
a=’a'
b=u'b'
c="{0} {1}“.format(a,b)//ok
c=u"{0} {1}".format(a,b) //ok 尽管有 uncode 未超过128
a='a'
b=u'中'
c="{0} {1}“.format(a,b)//ok
c=u"{0} {1}".format(a,b) //ok
c=u"{0}".format(b)//ok
a='中国'
b='中国'
c="{0} {1}“.format(a,b)//ok 不存在编码转换的过程
c=u"{0} {1}".format(a,b) // UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 可理解a 和b按照每8位 一个单位转换成一个unicode字符 a的ascii编码 的第一位超过了128 所以在转换成unicode编码时 会检查当前的assci编码是否合法
a='中'
b=u'过'
c=u”{0}{1}“.format(a,b) //decode error 检查a编码 发现超过128 当前文件编码是utf-8 则a是assci 的 且超过128
a='1'
b=u'过'
c=u"{0}{1}".format(a,b) //ok
a='中'
b=u'{0}'.format(a) //UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 因为默认是ascii 所以等价于a.decode('ascii')会出错
b=u'{0}'.format(a.decode('utf-8')) //表示从utf-8转换为unicode编码
a=u'中国'
b=json.dumps(a,ensure_ascii=False) //b=unicode
b=json.dumps(a.encode('utf-8'). ascii=False) //b != unicode 则 c=u"{0}".format(b) 报错 c=u"{0".format(b.decode('utf-8')) json.dumps 保持对象编码属性不变