python 编码小结

来源:互联网 发布:看美股行情软件 编辑:程序博客网 时间:2024/05/17 03:20

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


c="{0}".foramt(b) //UnicodeEncodeError: 'ascii' codec can't encode character u'\u56fd' in position 0: ordinal not in range(128)


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 保持对象编码属性不变


0 0
原创粉丝点击