解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX

news/2024/7/7 5:57:52

从网上抓了一些字节流,想打印出来结果发生了一下错误:

UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 8530: illegal multibyte sequence

代码

import urllib.request
res=urllib.request.urlopen('http://www.baidu.com')
htmlBytes=res.read()
print(htmlBytes.decode('utf-8'))

错误信息让人很困惑,为什么用的是'utf-8'解码,错误信息却提示'gbk'错误呢?

 

不仅如此,从百度首页的html中发现以下代码:

<meta http-equiv="content-type" content="text/html;charset=utf-8">

这说明网页的确用的是utf-8,为什么会出现Error呢?

 

在python3里,有几点关于编码的常识

1.字符就是unicode字符,字符串就是unicode字符数组

如果用以下代码测试,

print('a'=='\u0061')

会发现结果为True,足以说明两者的等价关系。

 

2.str转bytes叫encode,bytes转str叫decode,如上面的代码就是将抓到的字节流给decode成unicode数组

我根据上面的错误信息分析了字节流中出现\xbb的地方,发现有个\xc2\xbb的特殊字符»,我怀疑是它无法被解码。

用以下代码测试后

print(b'\xc2\xbb'.decode('utf-8'))

它果然报错了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

 

上网找了下utf-8编码表,发现的确特殊字符»的utf-8形式就是c2bb,unicode是'\u00bb',为什么无法解码呢。。。

仔细看看错误信息,它提示'gbk'无法encode,但是我的代码是utf-8无法decode,压根牛头不对马嘴,终于让我怀疑是print函数出错了。。于是立即有了以下的测试

print('\u00bb')

结果报错了:UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 0: illegal multibyte sequence

 

原来是print()函数自身有限制,不能完全打印所有的unicode字符。

知道原因后,google了一下解决方法,其实print()函数的局限就是Python默认编码的局限,因为系统是win7的,python的默认编码不是'utf-8',改一下python的默认编码成'utf-8'就行了

复制代码
import io
import sys
import urllib.request
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码
res=urllib.request.urlopen('http://www.baidu.com')
htmlBytes=res.read()
print(htmlBytes.decode('utf-8'))
复制代码

运行后不报错了,但是居然有好多乱码(英文显示正常,中文则显示乱码)!!又一阵折腾后发现是控制台的问题,具体来说就是我在cmd下运行该脚本会有乱码,而在IDLE下运行却很正常。

由此我推测是cmd不能很好地兼容utf8,而IDLE就可以,甚至在IDLE下运行,连“改变标准输出的默认编码”都不用,因为它默认就是utf8。如果一定要在cmd下运行,那就改一下编码,比如我换成“gb18030”,就能正常显示了:

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')         #改变标准输出的默认编码

最后,附上一些常用的和中文有关的编码的名称,分别赋值给encoding,就可以看到不同的效果了:

 

 

 

编码名称用途
utf8所有语言
gbk简体中文
gb2312简体中文
gb18030简体中文
big5繁体中文
big5hkscs繁体中文

转载于:https://www.cnblogs.com/hdk1993/p/8017495.html


http://www.niftyadmin.cn/n/1496370.html

相关文章

南京技师学院计算机系,江苏南京技师学院2021年招生录取分数线

学生的等级观念还不是很强&#xff0c;所以还是要好好去培养自己的学习观念。从基本知识成长起来的学生有着较强的竞争力&#xff0c;学习没有任何的捷径&#xff0c;所以学习越早越好&#xff0c;年轻的是学习的精力也是更强的&#xff0c;记忆力也比较好&#xff0c;知识学习…

Linux 内存泄露检测技巧

-bash: mtrace: command not found原因&#xff1a;系统缺少 glibc-utilscentos &#xff1a; sudo yum install glibc-utils 即可 由于 C 和 C 程序中完全由程序员自主申请和释放内存&#xff0c;稍不注意&#xff0c;就会在系统中导入内存错误。同时&#xff0c;内存错误往往…

uvm_reg_item——寄存器模型(五)

uvm_reg_item 扩展自uvm_sequence_item&#xff0c;也就说寄存器模型定义了transaction item. adapter 的作用是把这uvm_reg_item转换成uvm_sequence_item&#xff0c;再经由uvm_sequencer发送个uvm_driver&#xff0c;最终在总线上传输。 //---------------------------------…

JS编程建议——18:比较function语句和function表达式

建议18&#xff1a;比较function语句和function表达式在JavaScript语言中&#xff0c;既有function语句&#xff0c;也有函数表达式&#xff0c;这是令人困惑的&#xff0c;因为它们看起来是相同的。一个function语句就是值为一个函数的var语句的简写形式。下面的语句&#xff…

计算机考试前会让上机吗,计算机等级考试上机六大注意事项

究竟是什么原因呢?不就是那100道题目吗?翻来覆去的看也没有发现自己的程序有什么错误啊&#xff0c;看资料&#xff0c;用模拟盘模拟也是满分啊&#xff0c;可为什么正式考试就是0分呢?CNrencai网小编发现了一些问题&#xff0c;现在分享给大家。于是很多人甚至把通过上机考…

爱创课堂每日一题七十二天-如何删除一个cookie?

1.将时间设为当前时间往前一点。var date new Date();date.setDate(date.getDate() - 1);//真正的删除setDate()方法用于设置一个月的某一天。2.expires的设置document.cookie user encodeURIComponent(name) ;expires new Date(0)<strong>&#xff0c;<em>和…

建筑安全检查标准怎么计算机,建筑施工安全检查标准评分 怎么算

市政工程施工安全检查评定应符合本标准第3章~第8章中各检查评定项目的有关规定&#xff0c;并应按本标准附录A、附录B的评分表进行评分。分项检查评分表和检查评分汇总表的满分分值均应为100分&#xff0c;评分表的实得分值应为各检查项目所得分值之和&#xff0c;分项检查评分…

shell中awk命令常用用法总结

1、获取分隔的内容 以点为分隔符获取IP地址的最后一个字段 echo $ip | awk -F . {print $4}