python 中编码的再次学习
作者:
| 更新日期:之前曾研究过 python 的编码转换, 但是没有怎么详细记录。现在又遇到编码问题,记录一下。
本文首发于公众号:天空的代码世界,微信号:tiankonguse
前言
以前我在 python 中的小问题(持续更新中) 中只是简单的记录了一下 python 中编码的知识。
但是后来在使用 json.dumps 时遇到一个编码问题怎么也解决不了, 这个过程中有更深的了解了 python 的编码知识。
当然, 那个 json.dumps 问题, 回去睡了一觉,来之后瞬间就解决了。
背景知识
在 python 中最常见的就是 类型 str 和 unicode 了。
由于我的工作环境都是 utf8 编码, 所以我就不多说其他编码了, 这里只谈谈 utf8.
str 和 unicode 转换
str 和 unicode 的关系如下。
str -> decode -> unicode
unicode -> encode -> str
str是字节串,由unicode经过编码(encode)后的字节组成的
声明 str 类型的字符串
s = '中文'
s = u'中文'.encode('utf-8')
>>> type('中文')
<type 'str'>
>>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
>>> len(u'中文'.encode('utf-8'))
6
声明 unicode 类型的字符串
s = u'中文'
s = '中文'.decode('utf-8')
s = unicode('中文', 'utf-8')
>>> type(u'中文')
<type 'unicode'>
>>> u'中文'
u'\u4e2d\u6587'
>>> len(u'中文')
2
判断类型
print isinstance(u'中文', unicode)
print isinstance('中文', str)
总结
在python里,string object和unicode object是两种不同的类型。
string object是由characters组成的sequence,而unicode object是Unicode code units组成的sequence。
string里的character是有多种编码方式的,比如单字节的ASCII,双字节的GB2312等等,再比如UTF-8。
很明显要想解读string,必需知道string里的character是用哪种编码方式,然后才能进行。
Unicode code unit又是什么东西呢?一个Unicode code unit是一个16-bit或者32-bit的数值,每个数值代表一个unicode符号。
- string直接用引号来表示,unicode在引号前加一个u
- 直接输入的string常量会用系统缺省编码方式来编码,即十六进制 ‘/xe4/xbd/xa0/xe5/xa5/xbd’
- len(string)返回string的字节数,len(unicode)返回的是字符数
- print unicode不会乱码。现在我们常用的Linux、Windows系统,都是支持unicode的
本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。