Python2与Python3字节转换为字符串函数decode的区别

Python转换字节为字符串可以使用decode函数,但decode函数在Python 2和Python3有所不同。

Python 2.7

help查看decode的函数说明

>>> help(b''.decode)
Help on built-in function decode:

decode(...)
  S.decode([encoding[,errors]]) -> object

  Decodes S using the codec registered for encoding. encoding defaults
  to the default encoding. errors may be given to set a different error
  handling scheme. Default is 'strict' meaning that encoding errors raise
  a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
  as well as any other name registered with codecs.register_error that is
  able to handle UnicodeDecodeErrors.

Python 2.7的decode函数如果缺失encoding,使用的是系统默认的编码。

获取系统的默认编码

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

这里的系统默认编码为ascii,如果是非‘ascii’使用decode函数不指定编码会抛出异常

>>> s=u'你好'
>>> b=s.encode('utf8')
>>> print b.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal
not in range(128)
>>>
>>> print b.decode('utf8')
你好

字符串s使用utf8编码得到字节b,使用decode直接对字节b解码时,报ascii解码不了字节。使用decode指定解码为utf8后,解码正确。

所以,在Python 2使用decode对字节解码时,建议指定编码。

Python 3.x

使用help查看decode的帮助说明

>>> help(b''.decode)
Help on built-in function decode:

decode(encoding='utf-8', errors='strict') method of builtins.bytes instance
  Decode the bytes using the codec registered for encoding.

  encoding
   The encoding with which to decode the bytes.
  errors
   The error handling scheme to use for the handling of decoding errors.
   The default is 'strict' meaning that decoding errors raise a
   UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
   as well as any other name registered with codecs.register_error that
   can handle UnicodeDecodeErrors.

可以看出Python3中decode函数的默认编码指定为了utf-8。所以

b'hello'.decode()

等同于

b'hello'.decode('utf-8')
>>> s='你好'
>>> b=s.encode('utf8')
>>> b.decode()
'你好'

在这个例子里,你会看到对字符串s的赋值,‘你好’是没有u作为前缀。这是因为系统的默认编码为utf8

查看系统编码

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

在python 3,系统的默认编码为utf-8

版权声明:著作权归作者所有。

相关推荐

Python判断字符串是否为数字

Python判断一个字符串是否为数字,可以分为两种情况考虑。字符为纯数字如果需要检测的数字为纯数字,不包括负号,小数点等,可以使用字符串的isdigit()函数来判断>>> a = "001" >>> a.isdigit() True >>> a = &q

Python:字符串和datetime的转换

Python的字符串和时间的转换可以分别使用strptime和strftime。strptime(string parse time)datetime.strptime(date_string, format),根据format指定的时间格式解析用于表示时间的字符串date_string。>>>from datetime import&nb

Swift日期和字符串互相转换(Swift 3/Swift 4)

Swift随着版本的升级,日期类都会有一点变化。所以各个版本的Swift日期和字符串的转换有所不同。Swift 4String转换为Datevar dateString = "2017-11-17" var dateFormatter = DateFormatter() // dateFormat

TypeScript:字符串转换为数字

在TypeScript,String转换为Number有以下方式:Number构造函数(推荐)let n = Number('1234') // 1234 let nan = Number('abcd') // NaN +号操作符let n = +'1234' 

[译]Swift 4字符串的更新

又一年过去了,Swift String API又做了一些更改。Swift 4对String带来了一些很需要的改进以及简化。这些是我写的笔记,它记录了我的Swift字符串小抄关于Swift4需要做的改动。你可以在这里找到原来的和现在更新的指南以及Xcode playground:Swift String Cheat SheetXc