utf-8与unicode
在一般情况下,在内存中的使用的是unicode,而在存储或者传输时,使用的utf-8.因为utf-8是是不定长,可以减少存储的空间,或者传输时的带宽的占用.
如何理解编码与解码呢?
从 Python 3 的 str 对象中获取的元素是 Unicode 字符,这相当于从 Python 2 的 unicode 对象中获取的元素,而不是从Python 2 的 str 对象中获取的原始字节序列。
>>> s = ‘café‘
>>> len(s) # ?
4
>>> b = s.encode(‘utf8‘) # ?
>>> b
b‘caf\\xc3\\xa9‘ # ?
>>> len(b) # ?
5
>>> b.decode(‘utf8‘) # ?
‘café
- 变量s是一个unicode编码,需要将它转换成字节序列,需要对它进行编码.这里,可以想想数据通信时,也不是需要编码的吗?
.encode()
- 字节序列需要解码,
.decode()
处理文本文件
要尽早把输入(例如读取文件时)的字节序列解码成字符串。这种三明治中的“肉片”是程序的业务逻辑,在这里只能处理字符串对象。在其他处理过程中,一定不能编码或解码。对输出来说,则要尽量晚地把字符串编码成字节序列。多数 Web 框架都是这样做的,使用框架时很少接触字节序列。例如,在 Django 中,视图应该输出 Unicode 字符串; Django 会负责把响应编码成字节序列,而且默认使用 UTF-8 编码。
内置的 open 函数会在读取文件时做必要的解码,以文本模式写入文件时还会做必要的编码,所以调用 my_file.read()方法得到的以及传给 my_file.write(text) 方法的都是字符串对象。
但是有时候,不指定编码可能会发生错误.
>>> open(‘cafe.txt‘, ‘w‘, encoding=‘utf_8‘).write(‘café‘)
4
>>> open(‘cafe.txt‘).read() # 如果这里的系统默认编码不是utf-8,则会出现问题
‘caf??‘