

终于搞懂了python2和python3的encode(编码)与decode(解码) - 赵青青
source link: https://www.cnblogs.com/zhaoqingqing/p/17621867.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/17621867.html
终于搞懂了python2的编码#
在python2下碰到非常多次的中文乱码,这次来梳理一下编码问题。
在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicode。
unicode是中间编码,任何字符编码之前的转换都必须解码成unicode,再编码成目标字符编码
在python2读取文件时,如果文件编码是utf-8的,那么中文读取出来前面是带u的,即是unicode编码。
python2编码转换#
参考文章开头的图,任何编码转换之前都要解码成unicode,再转换到目标编码。
字节串-->decode('原来的字符编码')-->Unicode字符串-->encode('新的字符编码')-->字节串
# -*- coding: utf-8 -*-
utf_8_a = '中文'
gbk_a = utf_8_a.decode('utf-8').encode('gbk')
print(gbk_a.decode('gbk'))
#输出结果: 中文
在python2中,如果碰到decode为原来的字符编码出错,检查一下你真实的文件编码是否与文件头一致。
python3字符编码#
python 3的编码默认是unicode,所以字符编码之间的转换不需要decode过程,直接encode即可
注:在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型
如何明显的区分unicode及byte,string#
print type(xx)
unicode:
>>> unicode('中文','gbk')
u'\u4e2d\u6587'
byte:
python2文件头的UTF-8或GBK会影响乱码#
以python2举个例子,当文件编码头是GBK时,在py脚本中住csv中直接写入中文或者打印中文都是没有问题的。
可是当把文件的编码头改成UTF-8时,所有涉及中文的地方都要加上u前缀,否则打印会报错,写入到文件中的会是乱码
报错信息:
File "E:\Code\km\km\km\get_all_none_meta.py", line 70, in main
print '获取完所有无meta的md文件共{}个,结果保存在:{}'.format(len(md_filelist),csv_file_fullpath)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u65e0' in position 11: ordinal not in range(128)
UTF-8下乱码修正:
print '获取完所有无meta的md文件共{}个,结果保存在:{}'.format(len(md_filelist),csv_file_fullpath)
#在UTF-8下要给所有可能会出现中文的字符串前都加上u
print u'获取完所有无meta的md文件共{}个,结果保存在:{}'.format(len(md_filelist),csv_file_fullpath)
python2中字符串前加u有什么作用#
在 Python2 中,字符串前面加 u
表示这是一个 Unicode 字符串,即该字符串中可以包含任意 Unicode 字符,而不仅仅是 ASCII 字符集中的字符。如果没有使用 u
,那么默认字符串是由 ASCII 字符集组成的,无法包含非 ASCII 字符。
例如,使用 u
前缀可以将带有中文字符的字符串表示为 Unicode 字符串:
u_str = u'这是一个 Unicode 字符串'
如果没有使用 u
,则需要使用转义序列来表示中文字符:
str = '\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa Unicode \xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
需要注意的是,Python3 中所有的字符串都是 Unicode 字符串,因此不需要在字符串前面加 u
。
python2简易处理中文#
在一些python2的单文件的小工具中比较简单的处理中文,即不用在字符串前加u转成unicode,我的一个经验是:
把文件编码头改为GBK、GB18030,就不用特殊处理中文了,但会碰到中文在pycharame控制中打印出来是乱码,而在vscode中是好的。
# -*- coding: utf-8 -*-
print ('这是一段中文')#=>这是一段中文
# -*- coding: GB18030 -*-
print ('这是一段中文')#=>����һ������
直接运行py文件,中文输出是正常的,可以知道是pycharm的控制台编码设置为了UTF-8
调整sys.setdefaultencoding,没用,因为这是python虚拟机的。
在pycharm中修改全局的编码,没用,也可能是我用的社区版有bug
有这几种方法:
- 在打印log的前面加上u
- 在vscode中运行
最后,为了让兼容性更好地运行在python2及python3中,建议统一使用utf-8编码
python2和python3#
- 【中文】这两字GBK编码:\xd6\xd0\xce\xc4
在python2下可以直接打印gbk编码,而python3是不行
Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:19:08) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print ('\xd6\xd0\xce\xc4')
中文
从上面的输出也验证这者是等价的:\xd6\xd0\xce\xc4 == 中文
python3#
python3的输出如下:
Python 3.8.10 (tags/v3.8.10:3d8993a, May 3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('\xd6\xd0\xce\xc4')
ÖÐÎÄ
>>> str1 = '中文'.encode('utf8')
>>> str1
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print (str1.decode('utf8'))
中文
>>> print (str1.decode('gbk'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
#decode类型不匹配,所以出错
python dict打印出来是编码#
如果要显示中文,建议用字符串拼接,而不要用dict。
t={1:"中",2:"hi"} #打印结果 {1: '\xe4\xb8\xad', 2: 'hi'}
t2={1:"china",2:"hi"} #打印结果:{1:"china",2:"hi"}
参考资料#
Recommend
-
112
滑动验证页面 别离开,为了更好的访问体验,请滑动滑块进行验证,通过后即...
-
100
前言 初学Python时,总是被python的两个不太兼容的版本搞得头昏脑胀。按目前的发展趋势,python未来的主流版为python3。但是我们经常会遇到一些很有意思代码使用的是python2版本。于是我们需要同时拥有python2和python3的运行环境。这里介绍一个强大的软件Anaconda...
-
60
python2.7 会在 2020 年停止维护, 很多第三方包也在去掉对 python2.7 的支持, 最近终于完成了内部代码向 python3 的迁移, 整个过程挺繁琐的, 记录一下. 总共需要迁移的代码大概有 50w 行(cloc 计算, 去注释空行), 包括业务代码 +...
-
46
第一步、查看python的版本号以及安装路径; 通过以上的查看可以看到,python默认是指向到python2的,所以这里我们不动它,保持现状态...
-
30
前言 如果把时间拉到一年前我肯定不会写关于类型提示 (Type Hint) 或者 mypy 的内容。印象里在之前的博客或者知乎回答中明确提过「拒绝在代码中指定变量类型」,另外一个原因是 mypy 和类型提示相关的功能还在不断完善,业界还没...
-
5
Python2 Binary String 和 Python3 的转换 其实是一个非常特殊的情况,但是还是真是被这个小点坑了。这里记录下来,反思下。 这是一个在计算的代码,目的是为了实现对于一个原子体系的 FFT 计算用来模拟 X-ray 的成像。其中...
-
8
初学 Python 时,总是被 python 的两个不太兼容的版本搞得头昏脑胀。按目前的发展趋势,python 未来的主流版为 python3。但是我们经常会遇到一些很有意思代码使用的是 python2 版本。于是我们需要同时拥有 python2 和 python3 的运行环境。这里介绍一个强大的软...
-
8
在Centos7系统中,默认带的Python版本是Python2.7的,想用到Python3的新特性就需要升级.安装依赖包关于Python3.7以上的版本,需要多安装一个依赖包:> yum install -y libffi-deve...
-
27
从 python2 升级到 python3 有没有一键式工具?V2EX = way to explore V2EX 是一个关于分享和探索的地方
-
3
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/17455281.htmlTeamCity和pyflakes
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK