• www.tb0005.com_www.tb0005.com【官网】》》》

  • 发布时间:2016-01-13 05:13 | 作者:yc | 来源:互联网 | 浏览:1200 次
  • www.tb0005.com_www.tb0005.com【官网】》》》

    1.1Windows操控台

    下面是在windows操控台的运转成果:

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image001.png" style="border:none;" />

    能够看出在操控台,中翰墨符的编码是GBK而不是UTF-16

    转载自csdn博客

    1.在Python中运用中文

    在Python中有两种默许的字符串:str和unicode在Python中必然要把稳差异“Unicode字符串”和“unicode目标”的差异后边统统的“unicode字符串”指的都是python里的“unicode目标”

    事实上在Python中并没有“Unicode字符串”这么的器械,只要“unicode”目标一个传统含义上的unicode字符串彻底能够用str目标标明仅仅这时分它仅仅是一个字节省,除非解码为unicode目标,没有任何实践的含义

    咱们用“哈哈”在多个平台上测验,其间“哈”对应的不相同编码是:

    1.UNICODE (UTF8-16),C854;

    2.UTF-8,E59388;

    3.GBK,B9FE将字符串s(GBK编码)运用decode进行解码后,能够获得平等的unicode目标

    把稳:能够在操控台打印ss并不代表它能够直接被序列化,比方:

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image003.png" style="border:none;" />

    向文件直接输出ss会抛出相同的反常在处置惩罚unicode中翰墨符串的时分,有需要重要对它调用encode函数,变换成其它编码输出这一点对各个情况都相同

    总结:在Python中,“str”目标等于一个字节数组,至于里边的内容是不是一个合法的字符串,以及这个字符串选用啥编码(gbk, utf-8, unicode)都不主要这些内容需求用户自个纪录和判别这些的约束也相同适用于“unicode”目标要记着“unicode”目标中的内容可肯定不必然等于合法的unicode字符串,咱们很快就会看到这种状况

    总结:在windows的操控台上,支撑gbk编码的str目标和unicode编码的unicode目标

    1.2Windows IDLE(在Shell上运转)

    在windows下的IDLE中,运转感化和windows操控台不彻底合营:

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image005.png" style="border:none;" />

    能够看出,关于不运用“u”作标识的字符串,IDLE把其间的中翰墨符进行GBK编码可是关于运用“u”的unicode字符串,IDLE竟然相同是用了GBK编码,不相同的是,这时分每一个字符都是unicode(目标)字符!!此刻len(ss) = 4

    这么孕育发生了一个奇特的疑问,如今的ss无法在IDLE中正常显现并且我也没有法子把ss变换成正常的编码!比方选用下面的法子:

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image007.png" style="border:none;" />

    这有大概是因为IDLE本地化做得不敷好,对中文的支撑有疑问主张在IDLE的SHELL中,不要运用u“中文”这种法子,因为这么获得的并不是你想要的器械

    这一路说明IDLE的Shell支撑两种格局的中翰墨符串:GBK编码的“str”目标,和UNICODE编码的unicode目标

    1.3在IDLE上运转代码

    在IDLE的SHELL上运转文件,获得的又是不相同的成果文件的内容是:

    650) this.width=650;" alt="" src="http://p.blog.csdn.ne51网盘登陆t/images/p_blog_csdn_net/mayflowers//o_image009.png" style="border:none;" />

    直接运转的成果是:

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image011.png" style="border:none;" />

    毫无瑕疵,适当令人满意我没有试过其它编码的文件是否能正常运转,但想来该当是不错的

    相同的代码在windows的操控台试演过,也没有任何疑问

    1.4Windows Eclipse

    在Eclipse中处置惩罚中文愈加艰巨,因为在Eclipse中,编写代码和运转代码归于不相同的窗口,并且他们能够有不相同的默许编码关于如下代码:

    #!/usr/bin/python

    # -*- coding: utf-8 -*-

    s = "哈哈"

    ss = u'哈哈'

    print repr(s)

    print repr(ss)

    print s.decode('utf-8').encode('gbk')

    print ss.encode('gbk')

    print s.decode('utf-8')

    print ss

    前四个print运转正常,终极两个print都邑抛出反常:

    '/xe5/x93/x88/xe5/x93/x88'

    u'/u54c8/u54c8'

    哈哈

    哈哈

    Traceback (most recent call last):

    File "E:/Workspace/Eclipse/TestPython/Test/test_encoding_2.py", line 13, in

    print s.decode('utf-8')

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

    www.tb0005.com_www.tb0005.com【官网】》》》

    也等于说,GBK编码的str目标能够正常打印,可是不能打印UNICODE编码的unicode目标在源文件上点击“Run as”“Run”,然后在弹出对话框中遴选“Common”:

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image013.png" style="border:none;" />

    能够看出Eclipse操控台的缺省编码法子是GBK;以是不支撑UNICODE也在情理之中要是把文件中的coding改动成GBK,则能够直接打印GBK编码的str目标,比方s

    要是把源文件的编码设置成“UTF-8”,把操控台的编码也设置成“UTF-8”,按事理说打印的时分该当没有疑问可是试验标明,在打印UTF-8编码的str目标时,中文的终极一个字符会显现成乱码,无法正常阅览不过我现已很满意了,起码人家没有抛反常不是:)

    BTW: 运用的Eclipse版别是3.2.1

    1.5从文件读取中文

    在window下面用记事本改动文件的时分,要是保留为UNICODE或UTF-8,分袂会在文件的最初加上两个字节“/xFF/xFE”和三个字节“/xEF/xBB/xBF”在读取的时分就大概会碰到疑问,可是不相同的情况对这几个多于字符的处置惩罚也不相同

    以windows下的操控台为例,用记事本保留三个不相同版其余“哈哈”

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image015.png" style="border:none;" />

    翻开utf-8格局的文件并读取utf-8字符串后,解码成为unicode目标可是会把附加的三个字符相同进行变换,成为一个unicode字符,字符的数据值为“/xFF/xFE”这个字符不能被打印编码的时分需求超出这个字符

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_cwww.118kj.comsdn_net/mayflowers//o_image017.png" style="border:none;" />

    翻开unicode格局的文件后,获得的字符串准确这时分适用utf-16解码,能获得准确的unicdoe目标,能够直接运用残剩的那个添补字符在进行变换时会被过滤掉落

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image019.png" style="border:none;" />

    翻开ansi格局的文件后,没有添补字符,能够直接运用

    定论:读写运用python天生的文件没有任何疑问,可是在处置惩罚由notepad天生的文本文件时,要是该文件大概对错ansi编码,需求思虑怎么处置惩罚添补字符

    1.6在数据库中运用中文

    刚刚触摸Python,我用的数据库是mysql在实谋杀进、查找等操作时,要是运转情况运用的字符编码和mysql不合营,就大概致使运转时的同伴当然,和上面看到的状况相同,运转情况并不是关键身分,关键是查询句子的编码法子要是在每次实行查询操作时都把查询字符串做一次编码变换,转成为mysql的默许字符编码,相同不会碰到疑问可是这么写代码也太痛苦了吧

    运用如下代码毗连数据库:

    self.conn = MySQLdb.connect(use_unicode = 1, charset='utf8', **server)

    我不能懂得的是已然数据库用的默许编码是UTF-8,我毗连的时分也用的是UTF-8,为啥查询获得的文本内容却是UNICODE编码(unicode目标)?这是MySQLdb库的设置么?

    1.7在XML中运用中文

    运用xml.dom.minidom和MySQLdb相似,对天生的dom目标调用toxml法子获得的是unicode目标要是期望输出utf-8文本,有两种法子:

    1.运用体系函数

    在输出xml文档的时分进行编码,这是我感觉最佳的法子

    xmldoc.toxml(encoding=’utf-8’)

    xmldoc.writexml(outfile, encoding = ‘utf-8’)

    2.自个编码天生

    在运用toxml今后能够调用encode法子对文档进行编码但这种法子无法获得合适的xml declaration(xml文档榜首行中的encoding有些)

    不要测验颠末xmldoc.createProcessingInstruction来创立一个processing instraction:

    xml declaration只管看起来像是,可是事实上并不是一个processing instraction能够通下面的法子获得一个满意的xml文件:

    print >> outfile, “”

    print >> outfile, xmldoc.toxml().encode(‘utf-8’)[22:]

    其间第二行需求过滤掉落在调用xmldoc.toxml时天生的“”,它的长度是22

    相面是两种法子的用法比较:

    650) this.width=650;" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mayflowers//o_image021.png" style="border:none;" />

    其余,在IDLE的shell中,不要用 u’中文’ 对特征进行赋值上面评论争论过,这么获得的unicode字符串不准确

  • 相关内容

友情链接: