作家
登录

一筹莫展?来看看字符编码的前世今生吧

作者: 来源: 2017-11-02 15:16:43 阅读 我要评论

name

束手无策?来看看字符编码的前世此生吧

或者直接写str类型的字符串

  1. def main(): 
  2.     name = 'Python之禅' 
  3.     with open("output.txt""w"as f: 
  4.         f.write(name

当然,把 unicode 字符串精确地写入文件不止一种方法,但道理是一样的,这里不再介绍,把字符串写入数据库,传输到收集都是同样的道理

UnicodeDecodeError

UnicodeDecodeError 产生在 str 类型的字节序列解码成 unicode 类型的字符串时

  1. >>> a = u"禅" 
  2. >>> a 
  3. u'\u7985' 
  4. >>> b = a.encode("utf-8"
  5. >>> b 
  6. '\xe7\xa6\x85' 
  7. >>> b.decode("gbk"
  8. Traceback (most recent call last): 
  9.   File "<stdin>", line 1, in <module> 
  10. UnicodeDecodeError: 'gbk' codec can't decode byte 0x85 in position 2: incomplete multibyte sequence 

把一个经由 UTF-8 编码后生成的字节序列 '\xe7\xa6\x85' 再用 GBK 解码转换成 unicode 字符串时,出现 UnicodeDecodeError,因为 (对于中文字符)GBK 编码只占用两个字节,而 UTF-8 占用3个字节,用 GBK 转换时,还多出一个字节,是以它没法解析。避免 UnicodeDecodeError 的关键是保持 编码和解码时用的编率攀类型一致。

这也答复了文┞仿开首说的字符 "禅",保存到文件中有可能占3个字节,有可能占2个字节,具体处决于 encode 的时刻指定的编码格局是什么。

再举一个 UnicodeDecodeError 的例子

  1. >>> x = u"Python" 
  2. >>> y = "之禅" 
  3. >>> x + y 
  4. Traceback (most recent call last): 
  5.   File "<stdin>", line 1, in <module> 
  6. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 
  7. >>> 

str 与 unicode 字符串 履行 + 操作时,Python 会把 str 类型的字节序列隐式地转换成(解码)成 和 x 一样的 unicode 类型,但Python是应用默认的 ascii 编率攀来转换的,而 ASCII字符集中不包含有中文,所以报错了。相当于:

  1. >>> y.decode('ascii'
  2. Traceback (most recent call last): 
  3.   File "<stdin>"

      推荐阅读

      总是记不住密码怎么办?可以把它存在衬衫上

    捷报道,美国华盛顿大年夜学的研究人员正在研究所谓的“智能织物”,他们的重点放在磁化纺织品上。这种纺织品可以存储能被磁力仪攫取的少量数据,包含存储在大年夜多半智妙手机内部的数据。这>>>详细阅读


    本文标题:一筹莫展?来看看字符编码的前世今生吧

    地址:http://www.17bianji.com/lsqh/38408.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)