发布网友 发布时间:2022-04-22 17:53
共2个回答
懂视网 时间:2022-04-18 08:54
今天编写python爬虫,突然爬取的网页异常,并报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 41-50: ordinal not in range(256);UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal,这是明显的编码格式的问题。其实不仅是python2或者3,还是其他java,c等编程语言,经常会遇到编码格式的问题,异常头痛,尤其是ASCII、gbk、utf-8等编码之间的转换。于是查找资料、动手实践,找到这样的几个方法。
首先关于python的系统编码格式和输入输出格式,我们如何查看呢?
>>> import sys >>> sys.getdefaultencoding()# 系统默认编码格式 'UTF-8' >>> sys.stdout.encoding# 输入输出格式 'US-ASCII'
这种情况下表示,当前的命令行的输入输出编码是ascii,所以需要手动改成设置环境变量LANG为utf-8:
export LANG="en_US.UTF-8"
如果是在ubuntu环境下,可以将上面这行命令加入~/.bashrc中一劳永逸解决问题,加入后运行下面命令使其生效或者重启生效。
source ~/.bashrc
或者另一种方法是,只针对python设定相应编码(同上,命令行运行或者加入bashrc文件):
PYTHONIOENCODING='utf_8' export PYTHONIOENCODING
gbk编码示例图:
ascii编码表图部分:
在平时代码编程时别忘了给顶行加上:
# -*- coding: utf-8 -*-
设置python编码可以使用命令行,但是仅在本会话中生效
>>>sys.getdefaultencoding()查看当前编码(若报错,先执行>>>import sys >>>reload(sys)); >>>sys.setdefaultencoding('utf8')设置编码
在程序代码中重新载入SYS模块并设置uft-8也是可行的,但是在pycharm中会提示错误
import sys reload(sys) sys.setdefaultencoding('utf8') 重启Python解释器,发现编码已被设置为utf8; 这是因为系统在Python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动加上解决代码,属于一劳永逸的解决方法。
在平时开发时,我们都知道利用Decode和Encode进行转码操作。
Decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 Encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
在最新的python 3版本中,字符串的类型是str, 在内存中都是以Unicode表示,一个字符对应若干个字节;
如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'xe4xb8xadxe6x96x87' >>> '中文'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
友情链接【UTF-8编码转换工具】
【python3视频教程】
编码格式最初只有几种,由于计算机的普及,许多国家或组织的使用,编码格式也变得越来越多,但是国际通用的依然是UTF-8,所以应该有个良好的编程习惯,多使用UTF-8编码格式。在遇到编码问题时,也尽量保持编码格式的统一。
热心网友 时间:2022-04-18 06:02
1、python2与python3稍微有点区别
2、python2中默认的字符编码格式都是unicode,在字符串前加'u',表示unicode 编码
3、将unicode转换成中文,只需要用deconde解码就可以了
>>> u='欢迎'
>>> e=u.encode()
>>> e
b'\xe6\xac\xa2\xe8\xbf\x8e'
>>> e.decode()#python3中默认就是utf-8编码
'欢迎'
>>> e.decode('gbk')#如果解码为gbk就是乱码
'娆四繋'
python2编码环境比较复杂,在这里不做详细说明