下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

python编码的常见问题

作者:课课家教育     来源: http://www.kokojia.com点击数:1100发布时间: 2016-03-30 16:50:59

标签: python编码python归纳python

大神带你学编程,欢迎选课

  关于编码一直都是一个让Python编程学习者烦恼的问题,于是小编花了几天时间,弄明白这个问题后小编把关于python编码的知识点归纳起来,供读者参考学习。

  一、什么是编码,编码过程是怎样的?常见的编码方式有哪些?

  编码是从一个字符,比如‘哈’,到一段二进制码流的过程。而解码是从一段二进制码流到一个字符的过程。

  在编码的过程中,会涉及到三个名词:字符,内码,字符集。字符就是终端上显示的各个文字字母等。内码和字符是一一对应的关系。每一个字符都对应一个唯一的内码。内码在内存中的具体实现称为字符集。严格来说,编码指内码编码成字符集,解码指字符集解码为内码。

  ascii不仅仅指英文对应的内码,还包括它的具体实现,也就是它的字符集。它是用一个字节存储每个内码的。

  unicode是所有文字(包括英文,中文,日文等)所对应的内码的集合。其实现方式比较多样,常用的有UTF-8,GBK,GB18030。其中,UTF-8是一种不定长的内码实现方式。GB18030兼容GBK,GBK兼容GB2312。

  二、系统编码方式查询更改命令有哪些?(Linux)

  locale是最核心的一个变量,它包括12个基本属性。这12个基本属性构成某个地区的语言习惯、日期、货币、单位等文化因素。LC_ALL是强制修改locale信息的命令。LANG是locale的默认设置命令。因此,当LC_ALL强制locale信息以后,LANG的设置也就失效了。

  三、python中的编码问题

  在python中,需要分清楚三种编码:系统编码,python编码,文件编码。先面说一下这三种编码的作用。

  1、系统编码,通常也是写源码的编辑器的编码方式。它代表源码文件内的所有内容都是根据词方式编码成二进制码流,存入到磁盘中的。

  系统编码可以通过locale命令查看(LINUX)。

  2、python编码,是指python内设置的解码方式。如果不设定的话,python默认是ascii解码。它的设置方式有一下三种:

  第一种:在源码文件开头(一定要是第一行):#coding=UTF-8,源码文件的设置解码方式为UTF-8

  第二种:在源码文件开头(一定是第一行):#-*-coding:UTF-8-*-,源码文件的设置解码方式是UTF-8

  第三种:

  import sys

  reload(sys)

  sys.setdefaultencoding('UTF-8')

  个人推荐前两种。前两种的区别在于,第二种能够被其他语言识别,第一种只使用于python。

  下面举例说明系统编码和python编码的作用。

  系统编码:locale:gbk

  python源文件test.py

  #coding='UTF-8'

  s='哈'

  print s

  在test.py保存的时候,会按照系统编码方式GBK的方式,编码成gbk二进制码流,存储到磁盘上。当运行该程序时。gbk二进制码流调入内存,并按照python设置的解码方式解码,也就是按照UTF-8的方式解码。所以,源文件中的汉字“哈”显示按照gbk方式,编码成二进制码流,然后按照UTF-8的方式解码成unicode内码。可以想象,结果不是错误提示,就是显示出来的是乱码。

  还有一种情况需要用到python的默认解码方式。例如:

  系统编码:locale:gbk

  test.py

  #coding='gbk'

  s='哈'

  ss=s.encode('UTF-8')

  字符串s表示的是汉字“哈”的gbk编码的二进制码流(python中,所有字符串都表示的是相应的二进制码流,所有的unicode都表示的是相应的内码)。ss=s.encode('UTF-8')的过程中,会先对s的二进制码流,按照python设定的默认解码方式解码成unicode内码,然后对内码按照encode指定的编码方式编码。

  在字符串的处理过程中,记住一句话:对二进制码流,按照解码的编码处理。怎么理解这句话呢?

  例如:

  print s

  字符串s表示的是二进制码流,print函数把它交给系统,系统按照系统的编码方式解码饼显示。当然,如果系统的解码方式和s的编码方式不兼容的话,可能会报错或者乱码。

  再例如:

  f.write("%s\\r\\n"%str)

  字符串str表示的是二进制码流,f是打开的指定文件。str二进制码流按照f文件的编码方式进行解码和编码,结果保存在f文件中。

  为了安全起见,文件在打开的时候,最后指定文件编码方式。

  字符串和unicode的区别

  字符串表示的是编码后的二进制码流,unicode表示的是内码。所以,为了避免解码错误的出现,最好使用unicode表示。

  unicode的定义,使用

  1.s=u'哈':定义unicode字符串s。s表示的是哈的unicode内码

  2.ss=unicode(s,'gbk'):对字符串s按照gbk方式解码,ss表示解码后的内码

  3.import codecs

  f=codecs.open(filename,'r','gbk‘)

  s=f.read()

  按照gbk方式读取filename,读取后的内容转变成unicode内码存在变量s中。

赞(20)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程