解决Python解释器读取的字符集识别问题

python初学者编码实践中经常遇到encode error,decode error,如下:
例1:
unicodeencodeerror: 'ascii' codec can't encode character u'/u5728' in position 1
例2:
unicodedecodeerror: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte
1、百度的时候,大家都建议在代码文件头加上字符集定义:
# -*- coding: utf-8 -*-
这种方法大部分情况下可以解决大部分的问题。那么它解决的是什么问题呢?
我们需要理解两个概念:
1)、# -*- coding: utf-8 -*- 的作用是声明 python源代码文件的编码格式。 谁会读取python的源代码呢? 一个是ide编辑工具,比如pycharm,nodpad++,editpluss等,我们在写代码的时候使用。
2)、另一个是python解释器,是执行python程序的时候使用。
当我们使用ide编辑器打开python代码的时候,如果出现乱码,我们都知道是编辑器的解码方式和代码文件的编码方式不一致导致的。需要修改编辑器的解码方式。
那么python解释执行python程序的时候使用的是设么解码方式呢?可以用下面的方式查看:
sys.getdefaultencoding()
可以用下面的方式修改:
reload(sys)
sys.setdefaultencoding('utf-8')
sys.getdefaultencoding()
所以,代码文件第一行加 字符集定义,解决python解释器读取python代码文件时的字符集识别问题
2、在print的时候出现异常,或者写文件,或者解析网络报文,或者做str对象处理的时候出现乱码。
这个时候我们需要理解:
1)、文件读写、网络报文读写都可以理解为io读写。是byte处理,所以读写前后需要使用同样的字符编码方式。
2)、print、str对象的处理涉及到终端的编码格式。print之后,在pycharm的输出窗口,或者windows的cmd命令行窗口,或者linux的shell窗口,需要适配终端的编码方式
3)、字符编码基本可分为三大类:起源于美国的ascii,支持英文字符、数字、标点符号、键盘上的特殊字符;国际编码unicode,支持ascii的字符集外,又支持中文,韩语,日语等。因为unicode占用空间大,所以又出现了utf-8。需要强调的一点是:
unicode:简单粗暴,所有字符都是2bytes,优点是字符->数字的转换速度快,缺点是占用空间大
utf-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的bytes才能够准确表示
1.内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)
2.硬盘中或者网络传输用utf-8,网络i/o延迟或磁盘i/o延迟要远大与utf-8的转换延迟,而且i/o应该是尽可能地节省带宽,保证数据传输的稳定性。
下面详细介绍了unicode和utf-8的使用场景:
在程序执行之前,内存中确实都是unicode编码的二进制,比如从文件中读取了一行x=egon,其中的x,等号,引号,地位都一样,都是普通字符而已,都是以unicode编码的二进制形式存放与内存中的
但是程序在执行过程中,会申请内存(与程序代码所存在的内存是俩个空间),可以存放任意编码格式的数据,比如x=egon,会被python解释器识别为字符串,会申请内存空间来存放egon,然后让x指向该内存地址,此时新申请的该内存地址保存也是unicode编码的egon,如果代码换成x=egon.encode('utf-8'),那么新申请的内存空间里存放的就是utf-8编码的字符串egon了
针对python3如下图
浏览网页的时候,服务器会把动态生成的unicode内容转换为utf-8再传输到浏览器
如果服务端encode的编码格式是utf-8, 客户端内存中收到的也是utf-8编码的二进制。
从上面的说明,我们知道了unicode和utf-8的应用场景,就需要用下面的方式进行转换:
字符串通过编码转换为字节码,字节码通过解码转换为字符串
str--->(encode)--->bytes,bytes--->(decode)--->str


Summit Ridge超频版来袭!AMD具备和Intel一较高下的实力!
开发者故事 | DIY界氛围天花板!一款火爆社交平台的浪漫神器
人工智能黄金时代开启,微软重构对未来和工作的想象
深度学习的发展与应用,TensorFlow从研究到实践
SiC功率模块封装技术及展望
解决Python解释器读取的字符集识别问题
石墨烯有多神奇:充电7秒钟,行驶35公里
OPPO Reno5官网热销 提供三种配色可选
关于语音云3.0开启全自然交互的分析和应用
鼎阳科技推出SDS1000CF 4通道 带宽数字示波器
ad637引脚及其功能
瞄准户外电源百亿市场 紧跟连接器新趋势
中科大首次实现了按需式读取的可集成固态量子存储器,创最高纪录
《沃迪机器人生产制造基地项目》正式落户协议啦!
京东打造“三网通”助力实体经济平稳高质量发展
晶体管射频放大器参数测量的进展和意义
欧盟计划采取更严格措施阻止外国公司收购欧洲企业的知识产权
新火种AI | 商汤汤晓鸥猝然离世!中国AI领域的损失比想象中更多
直流系统接地故障测试仪
美国再次针对华为,警告巴西不要使用华为5G设备