亲宝软件园·资讯

展开

彻底解决Python编码问题

oaksharks 人气:3
## 1. 基本概念 - 字符集(Character set) - 解释:文字和符合的总称 - 常见字符集: - Unicode字符集 - ASCII字符集(Unicode子集) - GB2312字符集 - 编码方法(Encoding) - 解释:将字符对应到字节的方法,部分字符集和编码方法名称一样。 - 常见编码方法: - UTF-8:可对Unicode字符进行编码 - GB2312 - ASCII - 编码(Encode) - 解释:将字符集中字符按照一定规则转换成字节 - 解码(Decode) - 解释:与编码相反,将字节转换为字符集中的字符 - 字符集与编码方法的关系 - 每个字符集都有对应的编码方法 - 一种字符集可能有多种编码方法 - 不同的编码方法得到的字节不同,占用存储空间也不一样 - 例如Unicode字符可以使用UTF-8/ASCII/GBK等方法编码 - Unicode字符集包含世界上大部分字符,很多其他字符集有的字符它都有,是他们的超集 - 大部分字符集可以理解为Unicode的子集 - 实际上,除了Unicode之外所谓的字符集主要是对Unicode部分字符编码而已(定义编码方式) - 一种编码不必支持Unicode的所有字符(通常把它能支持的那部分称为它的字符集) ## 2. 关于编码的错误和解决方法 在开发过程中,我们所接触的字符集大多都是Unicode,大部分报错都是关于编码和解码的。 ### 2.1. 编码错误UnicodeEncodeError #### 2.1.1. 错误分析 导致该错误的原因通常是编码方法支持的Unicode字符不全;在工作中,你写了一个txt中文文档,想用ascii编码去保存这个文件,就会报这种错误。 **错误复现:** 我们知道`ascii`不支持字符`中`,那我们用`ascii`编码方法对`Unicode`码`中`进行编码: ```python # -*- encoding: utf-8 -*- u"中".encode(encoding='ascii') ``` 报错如下: ``` UnicodeEncodeError: 'ascii' codec can't encode character '\u4e2d' in position 0: ordinal not in range(128) ``` 这是一个`UnicodeEncodeError` 类型的错误,提示无法使用指定的编码方法对字符进行编码,报错提示中可以得到3个信息: - 当前使用的是acsii编码方法 - 被编码的字符是'\u4e2d' - ascii编码方法能支持的字符有128个 有时候我们还可以利用这个提示查看编码方法支持的字符个数: ```python # -*- encoding: utf-8 -*- u"中".encode(encoding='iso-8859-1') ``` 报错: ``` UnicodeEncodeError: 'latin-1' codec can't encode character '\u4e2d' in position 0: ordinal not in range(256) ``` 通过报错提示可以看出`iso-8859-1`能编256个字符。 接着,我们来看下用支持中文的`utf-8` 编码方法进行编码能得到什么结果: ```python # -*- encoding: utf-8 -*- s = u"中".encode(encoding='utf-8') print("s: ", s) print("s == 中?" , s == '中') print("type of s: ", type(s)) print("str==bytes? ", bytes == type(s)) ``` 输出: ``` ('s: ', '\xe4\xb8\xad') ('s == \xe4\xb8\xad?', True) ('type of s: ',

加载全部内容

相关教程
猜你喜欢
用户评论