浅谈Python编码

Python的编码问题可能是很多人都遇到过的问题(没遇到的终将会遇到的),笔者之前也对这个问题很模糊,今天看了《Effective Python》之后总结一下自己的理解。

Unicode

先看ASCII码,ASCII码我们比较熟悉,用一个字节表示了128个字符,其中包含标点符号,数字,英文字母等。

但是ASCII有一个问题,就是一个字节只有8位最多只能表示256个字符,不可能表示世界各个国家的字符。于是有了Unicode码。

Unicode码(统一码,万国码):用多个字节表示全世界的所有字符,为每一个字符分配了一个唯一的标识(一个整数),在表示一个 Unicode 的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。

来自Wiki百科:在文字处理方面,统一码为每一个字符而非字形定义唯一的代码(即一个整数)。换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器。

UTF-8

UTF-8:由于Unicode只是给每一个字符分配了一个整数值,但是没有规定如何存储这个整数值(比如:用几个字节存储),所以需要utf-8等编码。utf-8是一种将Unicode码转换成字节序列编码方式,是一种可变长编码。

可以这样理解:

  • Unicode -> utf-8编码 -> bytes
  • bytes -> utf-8解码 -> Unicode

UTF-8只是Unicode与字节流编码方式中的一种,还有UTF-16, GB-2312, GBK(windows系统的中文编码是GBK)编码等等。这些编码做的工作就是将Unicode规定字符对应的整数值用一个或多个字节表示出来。

因为IO,网络数据传输都是通过字节流的方式,所以在编程时需要将Unicode码转换成字节流再进行传输;同样需要将从IO,网络接收到的字节流转换成Unicode码。

bytes、str与unicode

Python2和Python3的不同点之一就是编码问题。其中str和unicode是Python2中的编码,而bytes和str是Python3中的编码。

Python2中的编码:

  • str:bytes序列的字符串
  • unicode:unicode码点序列 的字符串

Python3中的编码:

  • bytes: bytes序列的字符串。
  • str: unicode码点序列 的字符串。

让人疑惑的是str,str在Python2和Python3中表示不同的编码,Python2中表示字节序列,即bytes; Python3中表示Unicode码。个人理解是Python3想让在程序中定义的字符串使用Unicode码表示,而不是Python2中用字节流表示。

Python2
>>> string = "python"
>>> type(string)
<type 'str'>
>>> u_str = u"python"
>>> type(u_str)
<type 'unicode'>
Python3
>>> string = "python"
>>> bytes = b"python"
>>> type(string)
<class 'str'>
>>> type(bytes)
<class 'bytes'>

encode与decode

encode()和decode()是Python中用于bytes字节序列与Unicode序列转换的函数。

  • unicode.encode() -> bytes:只有对于unicode对象我们才应该使用.encode()方法。这一方法用来将一系列unicode编码为bytes流。
  • bytes.decode() -> unicode: 只有对于bytes,或说Python2中的str对象,我们才应该调用.decode()方法。这一方法将一系列bytes流解码为原本的unicode码点。
Python2
# str 与 unicode
>>> string = "python"
>>> type(string)
<type 'str'>
>>> u_str = u"python"
>>> type(u_str)
<type 'unicode'>

# str解码 -> Unicode
>>> de_string = string.decode()
>>> type(de_string)
<type 'unicode'>

# unicode 编码 -> str
>>> en_u_str = u_str.encode()
>>> type(en_u_str)
<type 'str'>
Python3
# str 与 bytes
>>> string = "python"
>>> bytes = b"python"
>>> type(string)
<class 'str'>
>>> type(bytes)
<class 'bytes'>

# str编码 -> butes
>>> en_string = string.encode()
>>> type(en_string)
<class 'bytes'>

# bytes 解码 -> str
>>> de_bytes = bytes.decode()
>>> type(de_bytes)
<class 'str'>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值