我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python2 和 Python3 中默

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python2 和 Python3 中默

最近在使用 Python3.4 做一些脚本实现,发现对于编码的处理上和 Python2.6 有很大的不同,就此机会把相关知识做个梳理,方便需要的时候查阅。

先说下概念和差异:

脚本字符编码:就是解释器解释脚本文件时使用的编码格式,可以通过 # -\*- coding: utf-8 -\*- 显式指定
解释器字符编码:解释器内部逻辑过程中对 str 类型进行处理时使用的编码格式
Python2 中默认把脚步文件使用 ASCII 来处理(历史原因请 Google)
Python2 中字符串除了 str 还有 Unicode,可以用 decode 和 encode 相互转换
Python3 中默认把脚步文件使用 UTF-8 来处理(终于默认就支持中文了,赞)
Python3 中文本字符和二进制分别使用 str 和 bytes 进行区分,也是使用 decode 和 encode 进行相互转换

关于默认脚本字符编码,因为对脚步文件处理的默认编码格式变了,所以很多针对内容的处理,都发生了变化,比如下面这个脚本。

import sys

print(sys.getdefaultencoding())
print('中文')

使用 Python3.4 解释器运行结果如下:

> python34 test.py
utf-8
中文

使用 Python2.6 解释器运行结果如下:

> python26 test.py
  File "test.py", line 4
SyntaxError: Non-ASCII character '\xe4' in file test.py on line 4, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

使用 Python2.6 报错就是因为第一条说的「Python2 中默认把脚步文件使用 ASCII 来处理」,但是脚步文件包含了中文,ascii 又没有覆盖中文,所以报错。如果我们把脚步稍作修改:

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

import sys

print(sys.getdefaultencoding())
print('中文')

增加了脚本字符编码的说明,再次使用 Python2.6 解释器运行结果为:

> python26 test.py
ascii
涓枃

因为明确指定了脚步文件编码格式为 utf-8,所以读取没问题,也就是说如果 Python2 脚本文件中包含了非 ASCII 字符时,一定要显式指定脚步文件编码格式,对于 Python3 因为默认的脚步文件编码格式就是 utf-8,所以没有这个问题(后面会有文章详细讨论这个问题)。

但是我们回头看下刚才的输出,结果显示为乱码。

乱码就涉及到另一个我们要说的不同点解释器字符编码,因为我们定义了 utf-8 格式读取脚步内容,但是因为 Python2.6 在 Windows 平台上,默认是使用 gbk 对字符进行 decode 输出,不信你看:

> python26
ActivePython 2.6.6.15 (ActiveState Software Inc.) based on
Python 2.6.6 (r266:84292, Aug 24 2010, 16:01:11) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s='中文'
>>> s
'\xd6\xd0\xce\xc4'
>>> s.decode('gbk').encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
>>> print('\xd6\xd0\xce\xc4')
中文
>>> print('\xe4\xb8\xad\xe6\x96\x87')
涓枃

完整描述下上面乱码出现的过程:
使用指定的脚本文件编码 utf-8 格式读取了「中文」,读取到的字符串内容为 '\xe4\xb8\xad\xe6\x96\x87',然后输出时 Python2.6 的解释器使用默认解释器字符编码 gbk 格式对读取内容进行 encode 输出,但是之前 utf-8 是 3 个字节长度表示一个中文,而 gbk 是用 2 个字节长度来表示中文,所以之前的 2 个中文,在输出的时候就按照 3 个中文进行编码(encode),当然就乱码了,仔细看那个乱码,就是 3 个字。

我们再用代码验证下上面说的内容:

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

import sys

print(sys.getdefaultencoding())
print('中文')
print('\xe4\xb8\xad\xe6\x96\x87')
print('\xe4\xb8\xad\xe6\x96\x87'.decode('gbk', 'ignore'))
print('\xd6\xd0\xce\xc4'.decode('gbk').encode('utf-8'))
print('中文'.decode('utf-8'))
print('\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
print('\xd6\xd0\xce\xc4')
print('\xd6\xd0\xce\xc4'.decode('gbk'))

看看输出结果:

> python26 test.py
ascii
涓枃
涓枃
涓枃
涓枃
中文
中文
中文
中文

很明显 gbk 格式解码的十六进制字符正常输出为中文了,显式使用 utf-8 对 utf-8 格式的十六进制字符进行 decode 也输出正常了。

同理,还可以看到另外 2 个现象:

把 py 文件用 utf-8 格式存储,并且包含「中文」字样时,如果使用 gbk 格式打开,也是看到「中文」显示的乱码和上面程序输出的一致;
如果把 py 文件使用 gbk 格式存储,这时候 print('中文') 也显示正常了;

乱码的终极原因就是:对同一个字符串的 encode 和 decode 编码格式不一致。

上面说的这个问题,如果文件存储和脚本文件编码都使用 utf-8 时,使用 Python3.4 是没有问题的,因为 Python3 默认的解释器字符编码是 utf-8 了,默认就可以处理中文了。

总结下结论:

  1. Python2 脚步文件尽量使用 gbk 格式存储;同理 Python3 脚步文件尽量使用 utf-8 格式存储;
  2. Python2 脚步如果带有中文字符时,请务必在脚本开头声明能支持中文的脚本文件编码;
  3. Python2 中对同一个字符串的 encode 和 decode 编码格式请保持一致;

说明:本次所有测试脚本文件均保存为 utf-8 格式

本文原创发布于公众号「sylan215」,十年测试老兵的原创干货,关注我,涨姿势!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python2 和 Python3 中默

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python2 和 Python3 中默

最近在使用 Python3.4 做一些脚本实现,发现对于编码的处理上和 Python2.6 有很大的不同,就此机会把相关知识做个梳理,方便需要的时候查阅。先说下概念和差异:脚本字符编码:就是解释器解释脚本文件时使用的编码格式,可以通过 #
2023-01-31

Python2 和 Python3 的

前言最近 Python 之父 Guido van Rossum(龟爷)终于在 Python 官方邮件组落实了 Python 2.7 的终焉之日(EOL)。说的是 Python 2.7 的 EOL 日期最终确定为 2020 年 1 月 1 日
2023-01-31

由 Python2 和 Python3

这几天在做一个功能实现的时候,需要把别人用 Python2.6 写好的脚步转成 Python3.4 实现,大部分地方转化都没啥问题,但是在 socket.inet_aton() 转化的过程中出了点问题,花费我不少的精力去解决,先做个记录备忘
2023-01-31

python2和python3的区别

1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和×××操作上可 以取得很好的优化结果。 Py3.1性能比Py2.5慢15%,还有很大的提升空间。 2
2023-01-31

python3 和 python2的区别

python2python31. Python3对Unicode字符的原生支持。Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str 和unicode,Python3只支持unicode的string。Pyt
2023-01-31

python2.x和python3.x的

Python的3​​.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下相容。许多针对早期Python版本设计的程式都无法
2023-01-31

Python3.x和Python2.x的

1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和×××操作上可 以取得很好的优化结果。 Py3.1性能比Py2.5慢15%,还有很大的提升空间。 2
2023-01-31

python2.x和python3.x共

下载python2.x和python3.x安装在同一目录下不同的文件夹配置环境变量(我是安装在F盘下)1.F:\Python272.F:\Python27\Scripts3.F:\Python334.F:\Python33\Scripts理
2023-01-31

Python2和Python3的区别,以

学习Python 2还是Python 3?罗振宇在今年的跨年演讲,《时间的朋友》中有个观点,大意是说,人们都有一种受虐情节,有时候希望别人对他粗暴一点。为此,他还举了两个例子,分别是“乔布斯对待消费者的态度”和“和菜头不尊重他的饮食需求”,
2023-01-31

转:python3和Python2的区别

print函数:(Python3中print为一个函数,必须用括号括起来;Python2中print为class)Python 2 的 print 声明已经被 print() 函数取代了,这意味着我们必须包装我们想打印在小括号中的对象。Py
2023-01-31

Python2和Python3选择哪个好

这篇文章主要介绍“Python2和Python3选择哪个好”,在日常操作中,相信很多人在Python2和Python3选择哪个好问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python2和Python3选择
2023-06-02

Python2的input(), raw_input()和Python3的input()

前言现在来探讨一下Python2中的input()、raw_input()函数和Pyhont3中的input()函数:Python2中的raw_input()函数,我们知道input()、raw_input()都是让用户输入的函数:inpu
2023-06-02

Python3和Python2有什么不同

今天就跟大家聊聊有关Python3和Python2有什么不同,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、打印时,py2需要可以不需要加括号,py3 需要python 2 :pr
2023-06-15

python2和python3的一些差别

未来python3是主流,但还是因为一部分原因,很多项目还在用python2。python3是不兼容python2的,做了一些优化和改进1.字符编码  python2:ascii编码  python3:unicode编码(默认utf-8)2
2023-01-30

python2和python3有什么区别

python2和python3有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象
2023-06-14

用python2和python3伪装浏览

python网页抓取功能非常强大,使用urllib或者urllib2可以很轻松的抓取网页内容。但是很多时候我们要注意,可能很多网站都设置了防采集功能,不是那么轻松就能抓取到想要的内容。今天我来分享下载python2和python3中都是如何
2023-01-31

Python2和Python3的一些语法

pythonPython2和Python3的一些语法区别1.print2.input3. python3版本相对2版本的部分其他区别问题:为何会出现乱码的情况问题:如何获取编码方式的信息?问题:在控制台上看到的到底是什么?1.print在版
2023-01-31

Python3 和 Python2 有什么区别

这篇文章给大家介绍Python3 和 Python2 有什么区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python3和Python2相比:1、Python3去除print语句,加入print()函数实现相同的功
2023-06-19

Python2和Python3的区别有哪些

本篇内容主要讲解“Python2和Python3的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python2和Python3的区别有哪些”吧!什么是鸭子类型(duck typing)
2023-06-03

python2和python3版本有哪些区别

这篇文章主要介绍了python2和python3版本有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Python主要用来做什么Python主要应用于:1、Web开发;
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录