美文网首页
Python2.x字符串编码思考

Python2.x字符串编码思考

作者: 四明羽客 | 来源:发表于2018-03-04 20:53 被阅读7次

ASCII, Unicode , GBK, UTF-8

上面这四个东东是两个层面上的东西,不能混为一谈。
ASCII和Unicode一类,都是一种字符编码标准,里面包含了字符集,编码格式。既然是标准,那么就是一种约定俗成的东西。
这是广义上的定义,我们一般说的ASCII和Unicode是指字符集。

GBK和UTF-8对等,它们分别是ASCII和Unicode两种标准下的一种编码格式。

编码格式是用来存储和传输的,用于将字符集中的code point转化为机器码(二进制码)

参考:网页编码就是那点事

Python 2.x str & unicode

python里的unicode就不是上面所说的标准或者字符集了,而是python定义的一种类型。

str可以认为是编码之后的字符串,它可以通过encode和decode这两个方式实现和unicode的相互转换。

注意:str的编码格式,如果是在解释器中输入的,则取决于解释器的默认编码,比如是在iterm中运行解释器,那么编码格式就由iterm的编码格式决定;如果是保存到文件中的,则取决于文件保存的编码格式,比如文件的编码格式是utf-8 ,那么解释器读取str的时候就是utf-8de编码格式。

encode和decode

# -*- coding: utf-8 -*-
s = '知行合一'
# s是一个utf-8格式的字符串
us = s.decode('utf-8')
# s被解码为unicode对象,赋值给us
ss = us.encode('gbk')
# us被编码成gbk格式的字符串,赋值给ss

但是事实情况要比这个复杂,比如看如下代码:

# -*- coding: utf-8 -*-
s = "知行合一"
s.encode('gbk')

看!str也能编码,(事实上unicode对象也能解码,但是意义不大)

为什么可以这样呢?其实str还是做了解码操作,只是这里的解码操作被隐藏起来了。流程还是和上面的一样,当对s进行编码之前,先会用默认的编码对s进行解码,再用解码之后的unicode对象进行编码。

这就引出了python2.x中在处理中文时,大多数出现错误的原因所在:python的默认编码,defaultencoding是ascii

还是上面的例子,上面的代码会报错,错误信息:UnicodeDecodeError: ‘ascii’ codec can’t decode byte ……

因为没有指定defaultencoding,所以它其实是在做这样的事情

# -*- coding: utf-8 -*-
s = "知行合一"
s.decode('ascii').encode('gbk')

显然中文字符超出了ASCII字符集的范围,出现解码错误

解决方法:
在文件的头部用# -*- coding:utf-8 -*-指明编码格式,并且保存文件的时候要选择相同的编码格式。

相关文章

  • Python2.x字符串编码思考

    ASCII, Unicode , GBK, UTF-8 上面这四个东东是两个层面上的东西,不能混为一谈。ASCII...

  • 2019-09-17 python2 unicode str

    Python2.X如何将Unicode中文字符串转换成 string字符串 普通字符串可以用多种方式编码成Unic...

  • 基础篇: 5. Python爱恨交织的字符串

    Python2.x的字符串的确是个大坑,每次编码都要小心翼翼地处理,但它优秀简洁的文本处理能力是不可不提的。 1....

  • 默认Python源文件编码

    Python2.x 1. 默认编码为 ASCII 2. 显式声明编码类型为‘UTF-8’ # Add the be...

  • 编码与解码问题

    编码与解码 对于我这样的新手来说python2.x的编码解码问题真是个坑,什么decode,encode,好乱好乱...

  • python_解决UnicodeEncodeError: 

    问题原因:由于python2.X默认编码是ascii, 解决方案:修改系统默认编码方式-》utf在python的L...

  • python入门 第二天 str

    编码与解码# -*- coding:utf-8 -*-# python2.x中使用temp = "张三"# 解码需...

  • Python 2

    针对Python2.x中Python中默认的编码格式是ASCII格式,在没修改编码格式时无法正确打印汉字。解决办法...

  • 全面拥抱unicode(Python3.0)

    我们知道,Python2.X版本的字符串有两种:字符串和Unicode字符串。因为这两种字符串类型,导致无数的本地...

  • golang字符串重新编码

    golang 字符串重新编码 golang 字符串重新编码//byte decode/*** function ...

网友评论

      本文标题:Python2.x字符串编码思考

      本文链接:https://www.haomeiwen.com/subject/tbzmmxtx.html