python的中文编码问题

原创 2012年03月22日 16:22:38

我很想就这个问题做个详细的解释,但也许水平有限,解释的不是很清楚,甚至自己理解的都不正确,那么我将长期修改

我使用pyscripter来作为编辑器,首先在pyscriter上打上这么一行代码

  运行,我们看到下面的运行结果 

然后使用notepad++打开这个python文件,如下截图:


源文件中中文乱码了,并且python运行的结果中文也乱码了

原因:

python源文件默认使用的ascii码作为编码方式,在notepad++中我们查看编码方式,可以发现这点儿,所以中文注释保存的话就乱码了

解决方法:

在pyscripter开头用一行

#_*_encoding:utf-8_*_

这就指明了源文件的编码格式为 utf-8,在运行发现结果如下

使用notepad++打开,发现中文已经不在乱码,并且查看编码方式已经成了utf-8


文件有不同的编码方式,常见的中文编码有utf-8和gb2312两种,那么我们来看python是如何处理中文的!

首先创建两个txt文档,test1.txt和test2.txt,内容都是“你好,世界!”两种分别用utf-8编码保存和ANSI编码保存,中文的ANSI就是gb2312,然后使用pyscripter写代码读取这两个文件,代码如下


运行结果如下:


我们看到使用utf8编码的读取出来已经乱码了,而gb2312编码的却没有乱码,那么是不是python默认打开文件的方式是gb2312呢?我们接着实践,从实践中获取答案,重写代码如下:


运行结果如下:

解释前我们先看下面几个函数:

一、python中与编码有关的函数
1、encode:由unicode编码转换为指定的其他编码。如:txt.encode("gb2312")则txt的表示为unicode->gb2312;txt.encode("utf-8")为unicode->utf-8转换。
2、decode:由指定的其他编码转换为unicode编码。如:txt.decode("gb2312")则txt的表示为gb2312->unicode;txt.decode("utf-8")为utf-8->unicode转换。
3、unicode:与decode相同。如:unicode(txt,"gb2312") 则txt的表示为gb2312->unicode转换。

当然了unicode是不能和ASCII之间转换的

所以不难理解,content1实际是utf8格式的编码,转换为unicode之后就正确显示了,但是为什么直接打印utf8格式的字符串却不行呢?我也不知道哦,那么我们再来试试下面这种方式


运行结果如下:


打开文件 test_utf8.txt文件时候,就指定了文件的编码方式为utf8

在向xml文件中写入中文的时候,如果xml的编码方式问utf-8,打开xml时候要指定xml文件的编码方式为utf-8,

impl = minidom.getDOMImplementation()
dom = impl.createDocument(None, 'Record', None)
root = dom.documentElement
for node_tag in self.record_filed_name:
            node = dom.createElement(node_tag)
            node.setAttribute("value","")
            root.appendChild(node)

f= codecs.open(TEMPLATE_FILE, 'w','utf-8')
dom.writexml(f, addindent='  ',newl='\n',encoding='utf-8')
f.close()

或者使用如下方式来写入中文:

sys.setdefaultencoding('gb18030')

正常的open(),而不用指定codecs编码格式,也可以。这样的python源文件编码就是gb18030了


似乎minidom不能处理编码方式是gbk的xml,因此建议使用utf-8格式的xml,网上给出了一种处理方法

f=codecs.open(dest_file,'rb','gbk')
tmp=f.read().encode('utf-8')
f.close
text=tmp.replace("gb2312","UTF-8")
f=open('utf8_tmp','wb')
f.write(text)
f.close()
minidom处理小的xml文件,对于比较大的可能效率比较低,可以使用elementTree


PyScripter中文乱码原因

原因是如果文件头部没有编码声明,那么PyScripter会默认使用ANSI打开文件。 而PyScripter默认的文件模板也不带编码声明,重新打开文件时间不以UTF-8打开,因此才会乱码。 解...
  • mybluesky1983
  • mybluesky1983
  • 2017年09月30日 14:14
  • 173

中文编码相关,python处理gbk编码的xml文件方法

XML文件的编码: W3C定义了三条XML解析器如何正确读取XML文件的编码的规则:  1,如果文挡有BOM(字节顺序标记,一般来说,如果保存为unicode格式,则包含BOM,ANSI则无),就...
  • guang11cheng
  • guang11cheng
  • 2012年04月23日 22:52
  • 6844

Python中使用中文导致的编码问题

Python的默认编码是ascii,当出现非ascii编码的时候,python的处理常常会报如下的错误: UnicodeEncodeError: 'ascii' codec can't enco...
  • miganxiaomei
  • miganxiaomei
  • 2016年03月31日 17:16
  • 315

PyScripter

  • 2014年09月08日 22:55
  • 37.02MB
  • 下载

python2.78+pyscripter2.53 附乱码解决方案

  • 2014年08月13日 10:25
  • 19.72MB
  • 下载

python解析gbk编码的xml

python解析xml,由于某些协会规定的原因,只能解析utf8和utf16的格式,而gbk和gb2312等解析的时候都会报错,但是对于某些...
  • whzhcahzxh
  • whzhcahzxh
  • 2014年06月23日 15:34
  • 1777

python编码问题

这里是一个图书馆读者借阅信息: 在对数据进行分析的过程中遇到了中文编码的问题,折腾了一上午也没有解决,最后我把源文件的文件格式改成utf-8格式,才正常显示。# -*- coding:utf-8 -...
  • kevinelstri
  • kevinelstri
  • 2017年02月13日 14:09
  • 284

Python 编码问题

1. “UnicodeDecodeError: ‘gbk’ codec can’t decode with open(filename, 'r') as f: data = f.read()...
  • lanchunhui
  • lanchunhui
  • 2018年01月18日 00:04
  • 13

Socket通讯简单实现,乱码问题

手机端 SocektThread.java package com.pxx; import java.io.BufferedReader; import java.io.InputStreamRea...
  • xiaoxiao54562
  • xiaoxiao54562
  • 2014年03月20日 10:09
  • 4917

解决Python中读Oracle数据库的中文编码问题

一、编码 字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等。字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、ISO 885...
  • melon0014
  • melon0014
  • 2016年09月06日 19:41
  • 2345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python的中文编码问题
举报原因:
原因补充:

(最多只允许输入30个字)