设为首页 加入收藏

TOP

字符、字符集、编码,以及它们python中会遇到的一些问题(下)(一)
2017-09-30 15:33:53 】 浏览:11053
Tags:字符 字符集 编码 以及 它们 python 遇到 一些 问题

在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主!

文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接!

侵删!!!

这一部分是下篇,主要讲的是编码部分,以及在python中会遇到的一些编码问题,偏向于实际应用一点。

上篇介绍了字符、字符集的一些概念,以及他们在python中的一些简单的代码示例,偏向于概念。

上篇地址:http://www.cnblogs.com/echo-coding/p/7435118.html

这绝对是个源远流长的大坑,对于新手来说恶心致死(尤其是windows)...........

   

二、decode、encode(python编码)

上面介绍了字符、字符集和字符编码,为这一小结做了准备。

   

一些重要概念:

系统编码:默认编码,正常情况下window系统默认是gbk,Linux系统默认是utf-8,可用locale.getdefaultlocale()和locale.setdefaultlocale()来控制,与encode有关

   

用python自带的locale模块来检测命令行的默认编码(也就是系统的编码)和设置命令行编码:

   

  1. import locale
  2. #get coding type
  3. print locale.getdefaultlocale()
  4. ('zh_CN', 'cp936')
  5. #set coding type
  6. locale.setlocale(locale.LC_ALL, locale='zh_CN.GB2312')
  7. print locale.getlocale()
  8. ('zh_CN', 'gb2312')

       

表明当前系统的内部编码是cp936,近似于GBK。实际上中文XP和WIN7的系统内部编码都是cp936(GBK)。

   

tips:linux系统下系统默认编码为utf8编码,window默认编码为gbk编码

   

python编码:指python内设置的解码方式。如果不设定的话,python默认的是ascii解码方式。如果python源代码文件中不出现中文的话,这个地方怎么设定应该不会问题。

   

  1. #查看python编码
  2. import sys
  3. sys.getdefaultencoding()
  4. #结果
  5. 'ascii'
  6. #更改python编码
  7. sys.setdefaultencoding('utf-8')

永久地将python默认采用的编码设置为utf-8:在python的Lib\site-packages文件夹下新建一个sitecustomize.py,内容为:

   

  1. # encoding=utf8
  2. import sys
  3. reload(sys)
  4. sys.setdefaultencoding('utf8')

此时重启python解释器,执行sys.getdefaultencoding(),发现编码已经被设置为utf8的了,多次重启之后,效果相同,这是因为系统在python启动的时候,自行调用该文件,设置系统的默认编码,而不需要每次都手动的加上解决代码,属于一劳永逸的解决方法。

   

文件编码:文本的编码方式,sys.getfilesystemencoding()

读写文件:

   内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()(变成unicode)。write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(), 转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。

   

  1. # coding: UTF-8
  2. f = open('test.txt')
  3. s = f.read()
  4. f.close()
  5. print type(s) # <type 'str'>
  6. # 已知是GBK编码,解码成unicode
  7. u = s.decode('GBK')
  8. f = open('test.txt', 'w')
  9. # 编码成UTF-8编码的str
  10. s = u.encode('UTF-8')
  11. f.write(s)
  12. f.close()

       

    另外,模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。使用codecs直接开unicode通道。

   

  1. # coding: GBK
  2. import codecs
  3. f = codecs.open('test.txt', encoding='UTF-8')
  4. u = f.read()
  5. f.close()
  6. print type(u) # <type 'unicode'>
  7. f = codecs.open('test.txt', 'a', encoding='UTF-8')
  8. # 写入unicode
  9. f.write(u)
  10. # 写入str,自动进行解码编码操作
  11. # GBK编码的str
  12. s = ''
  13. print repr(s) # '\xba\xba'
  14. # 这里会先将GBK编码的str解码为unicode再编码为UTF-8写入
  15. f.write(s)
  16. f.close()

   

python代码中的编码(代码编码):

    1、python代码中的字符串在未被指定编码的情况下,默认编码与代码文件本身的编码一致。举个例子:str = '中文'这个字符串,如果是在utf8编码的代码文件中,该字符串就是utf8编码;如果是在gb2312的文件中,该字符串就是gb2312编码。那么代码文件本身的编码怎么知道呢?

    (1)自己指定代码文件的编码:在代码文件的头部加上"#-*- coding:utf-8 -*-"来声明该代码文件为utf-8编码。此时未被指定编码的字符串的编码都变成了utf-8。

顶部的:# -*- coding: utf-8 -*-目前看来有三个作用。

        1、如果代码中有中文注释,就需要此声明(否则代码报错,无法解析)

        2、比较高级的编辑器(比如我的emacs),会根据头部声明,将此作为代码文件的格式。

       

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用haystack实现django全文检索.. 下一篇学习笔记GAN001:生成式对抗网络,..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目