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

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

3天内不再提示

Python中的默认编码

麦辣鸡腿堡 来源:Python都知道 作者:了不起 2023-07-05 16:11 次阅读

####1. Python源代码文件的执行过程

我们都知道,磁盘上的文件都是以二进制格式存放的,其中文本文件都是以某种特定编码的字节形式存放的。对于程序源代码文件的字符编码是由编辑器指定的,比如我们使用Pycharm来编写Python程序时会指定工程编码和文件编码为UTF-8,那么Python代码被保存到磁盘时就会被转换为UTF-8编码对应的字节(encode过程)后写入磁盘。当执行Python代码文件中的代码时,Python解释器在读取Python代码文件中的字节串之后,需要将其转换为UNICODE字符串(decode过程)之后才执行后续操作。

上面已经解释过,这个转换过程(decode,解码)需要我们指定文件中保存的字节使用的字符编码是什么,才能知道这些字节在UNICODE这张万国码和统一码中找到其对应的代码点是什么。这里指定字符编码的方式大家都很熟悉,如下所示:

# -*- coding:utf-8 -*-

图片

2. 默认编码

那么,如果我们没有在代码文件开始的部分指定字符编码,Python解释器就会使用哪种字符编码把从代码文件中读取到的字节转换为UNICODE代码点呢?就像我们配置某些软件时,有很多默认选项一样,需要在Python解释器内部设置默认的字符编码来解决这个问题,这就是文章开头所说的“默认编码”。因此大家所说的Python中文字符问题就可以总结为一句话: 当无法通过默认的字符编码对字节进行转换时,就会出现解码错误(UnicodeEncodeError)

Python2和Python3的解释器使用的默认编码是不一样的,我们可以通过sys.getdefaultencoding()来获取默认编码:

>> > # Python2
 >> > import sys
 >> > sys.getdefaultencoding()
'ascii'

 >> > # Python3
 >> > import sys
 >> > sys.getdefaultencoding()
'utf-8'

因此,对于Python2来讲,Python解释器在读取到中文字符的字节码尝试解码操作时,会先查看当前代码文件头部是否有指明当前代码文件中保存的字节码对应的字符编码是什么。如果没有指定则使用默认字符编码"ASCII"进行解码导致解码失败,导致如下错误:

SyntaxError: Non-ASCII character '\\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

对于Python3来讲,执行过程是一样的,只是Python3的解释器以"UTF-8"作为默认编码,但是这并不表示可以完全兼容中文问题。比如我们在Windows上进行开发时,Python工程及代码文件都使用的是默认的GBK编码,也就是说Python代码文件是被转换成GBK格式的字节码保存到磁盘中的。Python3的解释器执行该代码文件时,试图用UTF-8进行解码操作时,同样会解码失败,导致如下错误:

SyntaxError: Non-UTF-8 code starting with '\\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

3. 最佳实践

  • 创建一个工程之后先确认该工程的字符编码是否已经设置为UTF-8
  • 为了兼容Python2和Python3,在代码头部声明字符编码:-*- coding:utf-8 -*-
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54457
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473
收藏 人收藏

    评论

    相关推荐

    Python中文乱码怎么处理?python中文乱码解决办法

    `Python中出现乱码,英文显示没问题,一般是中文输出出现了编码问题,如果python文件没有指定编码,在执行过程中就会出现报错!
    发表于 12-27 15:13

    新手Python学习该学Python2还是Python3

    性能比Py2.5慢15%,还有很大的提升空间。2.编码Py3.X源码文件默认使用utf-8编码3. 语法1)去除了,全部改用!=2)去除``,全部改用repr()3)关键词加入as 和with,还有
    发表于 04-17 16:11

    python默认的解释器并不支持tab补全

    虽然python在linux系统默认安装的,但是python默认的解释器并不支持tab补全,所以推荐使用ipython。
    发表于 07-11 07:22

    请问Keil默认用的哪种编码

    '?', expected ')'我猜测是当前的编码方式在Keil中会有很多看不见的字符,导致了编译的错误请问Keil默认用的哪种编码
    发表于 08-12 04:35

    从RHEL 8 Beta开始不再默认系统Python版本

    为了改善用户体验,从 RHEL 8 Beta 开始不再强调“系统 Python”,不再默认一个 Python 版本。
    的头像 发表于 12-30 14:23 1716次阅读

    Python编码规范是怎么样的

    建议使用Emacs 的Python-mode 默认值: 4 个空格一个缩进层次。对于确实古老的代码,若不希望产生混乱,可以继续使用8 空格的制表符。在Emacs 的Python-mode 中会自动
    发表于 08-12 16:03 3次下载
    <b class='flag-5'>Python</b>的<b class='flag-5'>编码</b>规范是怎么样的

    科普:Python函数默认返回 None 的原因

    Python 有一项默认的做法,很多编程语言都没有——它的所有函数都会有一个返回值,不管你有没有写 return 语句。
    的头像 发表于 08-17 11:39 2131次阅读

    Python 函数默认返回None的原因

    Python 函数默认返回None是什么原因?定义的函数没有返回值,Python 解释器就会强行地默认给注入一段返回逻辑!实际上 Python
    的头像 发表于 08-21 10:51 2365次阅读
    <b class='flag-5'>Python</b> 函数<b class='flag-5'>默认</b>返回None的原因

    Python中最基本的10个内容

    时会遇上乱码问题,其原因是字符集的编码问题。Linux和Mac默认编码集是UTF8,而Windows则是
    发表于 12-11 11:54 1536次阅读

    详细介绍python中文件操纵相关知识

    encoding:可以不写。不写参数,默认编码本是操作系统默认编码本。windows默认gbk,linux
    的头像 发表于 09-13 11:40 638次阅读
    详细介绍<b class='flag-5'>python</b>中文件操纵相关知识

    Python编码与解码

    先做下科普:UNICODE字符编码,也是一张字符与数字的映射,但是这里的数字被称为代码点(code point), 实际上就是十六进制的数字。 Python官方文档中对Unicode字符串、字节
    的头像 发表于 07-05 15:59 540次阅读

    Python2与Python3中对字符串的支持

    其实Python3中对字符串支持的改进,不仅仅是更改了默认编码,而是重新进行了字符串的实现,而且它已经实现了对UNICODE的内置支持,从这方面来讲Python已经和JAVA一样优秀。
    的头像 发表于 07-05 16:15 529次阅读

    Python字符编码转换

    UNICODE字符串可以与任意字符编码的字节进行相互转换,如图: 那么大家很容易想到一个问题,就是不同的字符编码的字节可以通过Unicode相互转换吗?答案是肯定的。 Python2中的字符串进行
    的头像 发表于 07-05 16:25 829次阅读
    <b class='flag-5'>Python</b>字符<b class='flag-5'>编码</b>转换

    mysql数据库默认字符编码是什么

    MySQL数据库的默认字符编码是utf8mb4。下面我将详细介绍MySQL数据库的字符编码相关知识,并展开讨论相应的配置、应用和注意事项。 一、MySQL数据库字符编码简介 什么是字符
    的头像 发表于 11-16 14:50 684次阅读

    python中如何保存文件

    ( 'Hello, world!' ) 在上面的例子中,'filename.txt'是文件的路径,'w'是打开文件的模式,表示写入模式,encoding参数可选,指定文件的编码方式,默认为系统的默认
    的头像 发表于 11-24 09:32 567次阅读