中文乱码问题深入分析【10bet备用网址官网】
分类:多线程

在本文中,以'哈'来证明作示例解释全部的难点,“哈”的各类编码如下:

  1. UNICODE (UTF8-16),C854;
    2. UTF-8,E59388;
    3. GBK,B9FE。
    一、python中的str和unicode 直白以来,python中的普通话编码正是叁个极为头大的主题素材,平常抛出编码调换的不得了,python中的str和unicode到底是一个怎么着事物吗?
    在python中关系unicode,常常指的是unicode对象,比如'哈哈'的unicode对象为
    u'u54c8u54c8'
    而str,是二个字节数组,那个字节数组表示的是对unicode对象编码(能够是utf-8、gbk、cp936、GB2312State of Qatar后的储存的格式。这里它独有是叁个字节流,未有任何的意义,假让你想使这一个字节流显示的剧情有意义,就务须用正确的编码格式,解码突显。
    例如:
    10bet备用网址官网 1

对此unicode对象哈哈进行编码,编码成一个utf-8编码的str-s_utf8,s_utf8就是是一个字节数组,寄存的正是'xe5x93x88xe5x93x88',但是这无非是一个字节数组,如果你想将它经过print语句输出成哈哈,那您就深负众望了,为啥吗?

因为print语句它的落实是快要输出的内容传送了操作系统,操作系统会依赖系统的编码对输入的字节流举办编码,那就表明了为啥utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为 'xe5x93x88xe5x93x88'用GB2312去解释,其出示的出来正是“鍝堝搱”。这里再强调一下,str记录的是字节数组,只是某种编码的囤积格式,至于输出到文件也许打字与印刷出来是什么格式,完全决定于其解码的编码将它解码成什么样子。

此间再对print举行一些互补表达:当将三个unicode对象传给print时,在当中会将该unicode对象开展叁回转变,转变花销地的暗中同意编码(那仅是个体预计)

二、str和unicode对象的转变

str和unicode对象的转移,通过encode和decode实现,具体应用如下:

10bet备用网址官网 2

将GBK'哈哈'转变到unicode,然后再调换来UTF8

三、Setdefaultencoding

10bet备用网址官网 3

如上海教室的身体力行代码所示:

当把s(gbk字符串State of Qatar直接编码成utf-8的时候,将抛出特别,不过通过调用如下代码:

import sys

reload(sys)

sys.setdefaultencoding('gbk')

后就能够转换到功,为啥呢?在python中str和unicode在编码和解码进程中,要是将三个str直接编码成另风度翩翩种编码,会先把str解码成unicode,选择的编码为默许编码,平时暗中认可编码是anscii,所以在下面示例代码中首先次调换的时候会出错,当设定当前暗中同意编码为'gbk'后,就不会出错了。

有关reload(sysState of Qatar是因为Python2.5 初始化后会删除 sys.setdefaultencoding 这么些格局,大家须要再一次载入。

四、操作不一致文件的编码格式的公文

树立贰个文书test.txt,文件格式用ANSI,内容为:

abc中文

用python来读取

# coding=gbk

print open("Test.txt").read()

结果:abc中文

把文件格式改成UTF-8:

结果:abc涓枃

显然,这里需求解码:

# coding=gbk

import codecs

print open("Test.txt").read().decode("utf-8")

结果:abc中文

上边的test.txt小编是用Editplus来编排的,但当本身用Windows自带的记事本编辑并存成UTF-8格式时,

运作时报错:

Traceback (most recent call last):

File "ChineseTest.py", line 3, in 

print open("Test.txt").read().decode("utf-8")

UnicodeEncodeError: 'gbk' codec can't encode character u'ufeff' in position 0: illegal multibyte sequence

原来,某个软件,如notepad,在保留七个以UTF-8编码的文件时,会在文件开始的地点插入八个不可以看到的字符(0xEF 0xBB 0xBF,即BOM)。

之所以大家在读取时索要团结去掉那几个字符,python中的codecs module定义了那个常量:

# coding=gbk

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8")

结果:abc中文

五、文件的编码格式和编码评释的作用

源文件的编码格式对字符串的扬言有如何效用吧?这些难题找麻烦一贯苦恼了自笔者好久,以往总算有一点点眉目了,文件的编码格式决定了在该源文件中声称的字符串的编码格式,举例:

str = '哈哈'

print repr(str)

a.假诺文件格式为utf-8,则str的值为:'xe5x93x88xe5x93x88'(哈哈的utf-8编码)

b.要是文件格式为gbk,则str的值为:'xb9xfexb9xfe'(哈哈的gbk编码)

在第风流洒脱节已经说过,python中的字符串,只是一个字节数组,所以当把a情状的str输出到gbk编码的调整台时,就将体现为乱码:鍝堝搱;而当把b情况下的str输出utf-8编码的调整台时,也将显得乱码的难点,是什么样也未尝,可能'xb9xfexb9xfe'用utf-8解码呈现,正是家道壁立吧。>_<

讲完文件格式,将来来谈谈编码注解的作用吧,每个文件在最上边之处,都会用# coding=gbk 相近的话语声可瑞康下编码,不过那个宣称到底有啥样用呢?到止前得了,笔者感到它的法力也正是八个:

  1. 注明源文件少将面世非ascii编码,平日也正是普通话;

  2. 在高端的IDE中,IDE会将你的文件格式保存成你钦定编码格式。

  3. 垄断(monopoly卡塔尔源码中类似于u'哈'这类注脚的将‘哈'解码成unicode所用的编码格式,也是七个比较便于令人吸引的地点,看示例:

#coding:gbk

ss = u'哈哈'

print repr(ss)

print 'ss:%s' % ss

将这些些代码保存成三个utf-8文书,运维,你以为会输出什么吗?大家先是深感一定输出的早晚是:

u'u54c8u54c8'

ss:哈哈

唯独其实输出是:

u'u935du581du6431'

ss:鍝堝搱

怎会这么,这时,正是编码申明在作怪了,在运作ss = u'哈哈'的时候,整个进程能够分成以下几步:

1State of Qatar 获取'哈哈'的编码:由文件编码格式鲜明,为'xe5x93x88xe5x93x88'(哈哈的utf-8编码方式)

2卡塔尔国 转成 unicode编码的时候,在此个调换的历程中,对于'xe5x93x88xe5x93x88'的解码,不是用utf-8解码,而是用申明编码处钦点的编码GBK,将'xe5x93x88xe5x93x88'按GBK解码,拿到就是''鍝堝搱'',这七个字的unicode编码便是u'u935du581du6431',至止能够解释为何print repr(ss卡塔尔输出的是u'u935du581du6431' 了。

好了,这里有一点绕,大家来剖判下叁个演示:

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

ss = u'哈哈'

print repr(ss)

print 'ss:%s' % ss

将以此示例此次保存成GBK编码情势,运转结果,竟然是:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xb9 in position 0: unexpected code byte

此间怎会有utf8解码错误啊?用脑筋想上个示例也领略了,转变第一步,因为文件编码是GBK,得到的是'哈哈'编码是GBK的编码'xb9xfexb9xfe',当进行第二步,转产生unicode的时候,会用UTF8对'xb9xfexb9xfe'进行解码,而我们查utf-8的编码表会发掘,utf8编码表(关于UTF- 8解释可参见字符编码笔记:ASCII、UTF-8、UNICODE)中根本不设有,所以会报上述荒诞。

本文由10bet手机官网发布于多线程,转载请注明出处:中文乱码问题深入分析【10bet备用网址官网】

上一篇:BAT文件语法和技巧【10bet备用网址官网】 下一篇:没有了
猜你喜欢
热门排行
精彩图文