资讯专栏INFORMATION COLUMN

python中的编码问题

forsigner / 1202人阅读

摘要:在控制台执行命令中文,可以将解释为命令,中文,从而到到对象。中文以上的对象其实是,即字节码,若终端是编码的话,那么就是用的字节码。那么这里的是什么呢默认是,这正是错误为什么报无法用解码的原因中文将默认编码改为,即可。

问题

在平时工作中,遇到了这样的错误:

UnicodeDecodeError: "ascii" codec can"t decode byte

想必大家也都碰到过,很常见 。于是决定对python的编码做一个整理和学习。

基础知识

在python2.x中,有两种数据类型,unicode和str,这两个都是basestring的子类

>>> a = "中"
>>> type(a)

>>> isinstance(a,basestring)
True
>>> a = u"中"
>>> type(a)

>>> isinstance(a,basestring)
True

两者的区别,概括来讲,str是字节串,由unicode经过编码(encode)后的字节组成的(好比与python3.x的byte);unicode是对象,才是真正意义上的字符串,由字符组成

>>> a="中文"
>>> len(a)
6
>>> repr(a)
""xe4xb8xadxe6x96x87""
>>> b=u"中文"
>>> len(b)
2
>>> repr(b)
"u"u4e2du6587""
控制台和脚本

在linux下的python控制台执行以下命令,所得的结果和执行脚本是不同的

>>> a = u"中文"
>>> repr(a)
"u"xe4xb8xadxe6x96x87""
>>> b = unicode("中文","utf-8")b)
>>> repr(b)
"u"u4e2du6587""

可以看到,u"中文"初始化的对象a不是我们所期望的,那究竟是什么原因呢?
将python看成是一根管子,管子里头处理的中间过程都是使用unicode的。入口处,全部转成unicode;出口处,再转成目标编码(当然,有例外,处理逻辑中要用到具体编码的情况)。
在控制台执行命令a = u"中文",可以将解释为命令,a = ‘中文’.decode(encode),从而到到unicode对象a。那么这里的encode是什么呢?对于控制台来说,就是标准输入,即sys.stdin.encoding

>>> sys.stdin.encoding
"ISO-8859-1"

我的这边控制台默认的编码是ISO-8859-1,故a = u"中文" <=> a = "中文".decode("ISO-8859-1")
这里的"中文"是控制台理解的,即使根据终端编码方式编码后的字节码,对于utf-8编码的终端,"中文"="xe4xb8xadxe6x96x87"

>>> a="中文".decode("ISO-8859-1") 
>>> repr(a)
"u"xe4xb8xadxe6x96x87""

那如何修改此编码值呢,设置为什么呢?在linux环境中设置环境变量方法如下,具体设置什么只要与终端编码方式一直即可

export PYTHONIOENCODING=UTF-8
总结

重新回到最初的那个问题,造成问题的原因是没有搞清楚unicode和str的区别,将两者进行了混用。

>>> a = "中文"
>>> a.encode("gbk")
Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: "ascii" codec can"t decode byte 0xe4 in position 0: ordinal not in range(128)

以上的对象a其实是str,即字节码,若终端是utf-8编码的话,那么a就是用utf-8 encode的字节码。a.encode("gbk") 等价于a.decode(encoding).encode("gbk"),即先将字节码解码为unicode字符,然后再encode为字节码。unicode对象作为中转站。那么这里的encoding是什么呢?

>>> import sys
>>> sys.getdefaultencoding()
"ascii"

默认是ascii,这正是错误为什么报无法用ascii解码的原因

>>> reload(sys)

>>> sys.setdefaultencoding("utf-8")
>>> a = "中文"
>>> repr(a)
""xe4xb8xadxe6x96x87""
>>> a.encode("gbk")
"xd6xd0xcexc4"

将默认编码改为utf-8,即可。不鼓励对str使用encode方法,因为其中隐式对str进行了解码。decode只对str,encode只对unicode,一切decode/encode都显示指定编码方式。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37739.html

相关文章

  • Python 与 Unicode

    摘要:最近使用处理一些网络相关的问题,被相关的一系列编码问题搞得一头雾水。与接下来是中对于字符串的处理。中的和在中,其类型规定了底层的数据结构,是位整数串,也即跟语言中的字符串类似。这些问题在中得到解决。 最近使用 Python 2 处理一些网络相关的问题,被 Unicode, String 相关的一系列编码问题搞得一头雾水。在这里整理一下相关的概念吧。 ASCII Unicode UTF8...

    Tangpj 评论0 收藏0
  • Python的中文编码问题

    摘要:使用中文替代中文中文编码中文编码中有以上两种声明字符串变量的方式,它们的主要区别是编码格式的不同,其中,的编码格式和文件声明的编码格式一致,而的编码格式则是。 字符串是Python中最常用的数据类型,而且很多时候你会用到一些不属于标准ASCII字符集的字符,这时候代码就很可能抛出UnicodeDecodeError: ascii codec cant decode byte 0xc4 ...

    Cheriselalala 评论0 收藏0
  • Python入门-基本语法1

    摘要:根据有效范围作用域分为全局变量和局部变量。类型以开头标识类型以开头标识类型以进制的字节码表示,实际上是一个字节串,回应了它的另一个名字。 < 返回索引页 基本语法 Hello World 代码注释 关键字 数据类型 变量、常量 变量 变量赋值 变量命名 变量的作用域 常量 字符串与编码 字符转义 字符编码 字符串操作 运算符与表达式 运算符 表达式 ...

    ingood 评论0 收藏0
  • unicode之痛【精校版】

    摘要:之痛原文地址译者校正实用编程指南这是我在所做的演讲。事实一和二共同造成了计算机设备结构与世界人类需求的一个冲突。就是为了解决之前的老的字符集问题。值意味着,失败时将会返回一个标准的替代字符。将使用进行了解码。 Unicode之痛原文地址: http://nedbatchelder.com/text...译者: yudun1989 校正: sicklife实用Unicode编程指南这是...

    zombieda 评论0 收藏0
  • Python2.x 字符编码终极指南

    摘要:值得注意的是,有的编码方案不一定能表示某些信息,这时编码就会失败,比如就不能用来表示中文。数组的每一项是一个字节,用来表示。所以对于字符串来说,其长度等于编码后字节的长度。所以,让来编码解码中文,就超出了其能力范围。 在人机交互之字符编码 一文中对字符编码进行了详细的讨论,并通过一些简单的小程序验证了我们对于字符编码的认识。但仅了解这篇文章的内容,并不能帮我们在日常编程中躲过一些字符编...

    Amio 评论0 收藏0
  • Python: 熟悉又陌生的字符编码

    摘要:常见的字符编码有编码,编码,编码等。码只规定了个字符的编码,这在美国是够用的。小结是一种针对的可变长度字符编码,它是的实现方式之一。 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概念。本文主要分以下几个部分介绍: 基本概念 常见字符编码简介 Python 的默认编码 Py...

    Vultr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<