0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:博客园 作者:Z贺 2020-12-31 11:04 次阅读

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如下图

o4YBAF9uKPmAfXDIAANLAfxpakc336.png

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

pIYBAF9uKPqARsmsAAAhiFKaqcs00.jpeg

如果服务端encode的编码格式是utf-8, 客户端内存中收到的也是utf-8编码的二进制。

从上面的说明,我们知道了unicode和utf-8的应用场景,就需要用下面的方式进行转换:

字符串通过编码转换为字节码,字节码通过解码转换为字符串

str--->(encode)--->bytes,bytes--->(decode)--->str

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83483
  • UTF-8
    +关注

    关注

    0

    文章

    13

    浏览量

    7817
收藏 人收藏

    评论

    相关推荐

    LCD液晶显示汉字字符集

    LCD液晶显示汉字字符集
    发表于 02-24 13:30

    好用的python解释

    Python是一门解释语言,代码想运行,必须通过解释执行,Python存在多种
    发表于 04-13 14:54

    如何查询Oracle client端的字符集

    什么是Oracle字符集?如何查询dmp文件的字符集?如何查询Oracle client端的字符集
    发表于 05-26 06:42

    RISC-V MCU IDE MRS(MounRiver Studio)开发之:设置工程编码字符集

    字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集是多个字符的集合,字符集种类繁多,每个字符集包括的
    发表于 11-23 10:20

    怎样去使用C语言字符集呢?有哪些规则

    C语言字符集的特点有哪些呢?怎样去使用C语言字符集呢?有哪些规则?
    发表于 02-25 07:43

    python正则表达式字符集

    对比上面例子中输出的结果来理解。我们都知道,正则表达式本身就定义了一些规则,比如 \d,匹配所有数字字符,其实它是等价于 [0-9],下面也写了个例子,通过字符集的形式解释了这些特殊字符
    发表于 03-17 16:48

    字符集和字库有什么联系?

    字符集和字库 是同一个对象吗
    发表于 10-12 06:29

    SVM在小字符集手写体汉字识别中的应用研究

    本文将支持向量机(SVM)引入到小字符集脱机手写体汉字识别中。文章首先介绍了SVM的基本原理和主要算法,然后在实验中采用了LibSVM训练软件,针对银行票据手写汉字的小字符集
    发表于 08-14 11:37 20次下载

    LCD液晶显示汉字字符集

    LCD液晶显示汉字字符集
    发表于 12-23 02:02 0次下载

    字符集字符集编码详解

    字符集字符集编码详解
    发表于 09-12 08:33 4次下载
    <b class='flag-5'>字符集</b>与<b class='flag-5'>字符集</b>编码详解

    MySQL字符集的设置修改和排序规则

    大家都知道,计算机只能识别二进制码,为了让计算机能处理文字,人们给每个文字进行编码,这个编码就是计算机字符集的由来。
    的头像 发表于 04-16 17:10 1.8w次阅读
    MySQL<b class='flag-5'>字符集</b>的设置修改和排序规则

    python正则表达式字符集

    字符集是由一对方括号 “[]” 括起来的字符集合。使用字符集,可以匹配多个字符中的一个。 举个例子,比如你使用 C[ET]O 匹配到的是 CEO 或 CTO ,也就是说 [ET] 代表
    的头像 发表于 03-17 16:48 1067次阅读

    一文带你搞懂字符集编码

    软件开发人员经常遇到“中文乱码”、“软件不能显示日文”等类似问题。真相只有一个——对字符集编码没有一个系统的认知。
    的头像 发表于 06-09 10:20 1075次阅读
    一文带你搞懂<b class='flag-5'>字符集</b>编码

    一文详解字符集编码

    软件开发人员经常遇到“中文乱码”、“软件不能显示日文”等类似问题。真相只有一个——对字符集编码没有一个系统的认知。
    的头像 发表于 07-18 09:57 475次阅读
    一文详解<b class='flag-5'>字符集</b>编码

    mysql8.0默认字符集是什么

    MySQL 8.0 默认字符集是 utf8mb4。 MySQL 8.0 是当前最新的开源关系型数据库管理系统,由Oracle公司开发和维护。MySQL 8.0 默认字符集是 utf8mb4,这个字符集
    的头像 发表于 11-16 14:48 1113次阅读