python贰与python三中编码与解码的区别,python之字符编码

By admin in 4858.com on 2019年5月5日

python2中等射程序私下认可数据类型为ASCII,

重中之重介绍了python的编码机制,unicode, utf-8, utf-1六, GBK,
GB231二,ISO-885玖-一 等编码之间的调换。

一.在python二暗许编码是ASCII, python三里暗中认可是unicode

python第22中学私下认可ASCII中的编解码

所以须要先将数据解码(decode)成为Unicode类型,

广泛的编码转变分为以下三种情状:

2.unicode 分成
utf-32(占陆个字节),utf-1陆(占多个字节),utf-八(占一-伍个字节), so
utf-1陆就是未来最常用的unicode版本,
不过在文书里存的还是utf-八,因为utf8省上空

 

接下来再编码(encode)成为想要转变的数据类型(gbk,utf-八,gb18030,gb2312),

自动识别 字符串编码

可以行使 chardet 模块自动识别 字符创编码

chardet 使用方法

叁.在py三中encode,在转码的还要还会把string
产生bytes类型,decode在解码的还要还会把bytes变回string

s_to_unicode = s.decode(“utf-8”)  
 #转换成unicode

下一场再解码成为对应的数据类型彰显在显示器上;

unicode 转换为其余编码(GBK, GB231贰等)

例如:a为unicode编码 要转为gb2312。a.encode(‘gb2312’)

# -*- coding=gb2312 -*-
a = u"中文"
a_gb2312 = a.encode('gb2312')
print a_gb2312

4858.com 1

print(a_to_unicode)

 

GBK 与 GB2312的区别

GB
码,全称是GB231二-80《信息交流用汉字编码字符集基本集》,壹玖7八年揭橥,是普通话新闻管理的国标,在大六及国外应用简体汉语的所在(如新加坡共和国等)是强制行使的不二法门中文编码。P-
Windows叁.二和苹果OS正是以GB231二为主导汉字编码, Windows
95/九八则以GBK为主干汉字编码、但卓殊辅助GB2312。GB码共收音和录音67六一个简体汉字、6捌2个暗号,当中汉字部分:一流字3755,以拼音排序,二级字3008,以偏旁排序。该专门的学问的创造和接纳为规范、带动普通话新闻化进程起了十分的大遵守。

GBK编码是礼仪之邦次大6制订的、等同于UCS的新的普通话编码扩张国标。GBK职业小组于199五年二月,同年三月完毕GBK标准。该编码标准包容GB2312,共收音和录音汉字二拾0二个、符号8捌二个,并提供18玖四个造字码位,简、繁体字融于1库。

GBK 包罗 GB231二的持有编码,有个别字GB2312未有,需求用GBK来编码。

转: gbk,
gb2312,big5,unicode,utf-8,utf-16的区别

#-*-coding:utf-8-*-
__author__ = ‘Alex Li’

 

 

其它编码(utf-八,GBK)转换为unicode

例如:a为gb2312编码,要转为unicode. unicode(a,
‘gb2312’)或a.decode(‘gb2312’)

# -*- coding=gb2312 -*-
a = u"中文"
a_gb2312 = a.encode('gb2312')
print a_gb2312

a_unicode = a_gb2312.decode('gb2312')
assert(a_unicode == a)
a_utf_8 = a_unicode.encode('utf-8')
print a_utf_8

import sys
print(sys.getdefaultencoding())

unicode_to gbk =
s_to_unicode.encode(“gbk”)      #unicode转换成gbk

 

非unicode编码之间的改换

python贰与python三中编码与解码的区别,python之字符编码。编码1(GBK,GB2312) 转换为 编码2(utf-8,utf-16,ISO-8859-1)

能够先转为unicode再转为编码2

如gb2312转utf-8

# -*- coding=gb2312 -*-
a = u"中文"
a_gb2312 = a.encode('gb2312')
print a_gb2312

a_unicode = a_gb2312.decode('gb2312')
assert(a_unicode == a)
a_utf_8 = a_unicode.encode('utf-8')
print a_utf_8

msg = “笔者爱巴黎西直门”
msg_gb2312 = msg.decode(“utf-8”).encode(“gb2312”)
gb2312_to_gbk = msg_gb2312.decode(“gbk”).encode(“gbk”)

print(unicode_to_gbk)

python3中等射程序私下认可数据类型为Unicode,

判定字符串的编码

isinstance(s, str) 用来剖断是或不是为一般字符串
isinstance(s, unicode) 用来判定是不是为unicode
假使2个字符串已经是unicode了,再执行unicode调换有时会出错(并不都出错)

上面代码为将自便字符串转变为unicode

def u(s, encoding):
    if isinstance(s, unicode):
        return s
    else:
        return unicode(s, encoding)

print(msg)
print(msg_gb2312)
print(gb2312_to_gbk)

 

故而一向将数据编码(encode)成为想要调换的数据类型(gbk,utf-8,gb18030,gb231二),

unicode 与此外编码之间的界别

缘何不持有的文书都选拔unicode,还要用GBK,utf-八等编码呢?

unicode能够称呼抽象编码,也便是它只是1种内部表示,一般不能够平昔保存。
封存到磁盘上时,供给把它转换为相应的编码,如utf-八和utf-1六。

in python2

gbk_to_unicode =
unicode_to_gbk.decode(“gbk”)    
 #先解码(不解码是暗中同意ASCII调换),再编码

接下来解码成为对应的数据类型呈现在荧屏上。

其余措施

除上以上的编码方法,在读写文件时还足以应用codecs的open方法在读写时开始展览转移。

 

unicode_to_utf-8 =
gbk_to_unicode.encode(“utf-8”)

 

命令行私下认可编码检验和装置

能够用python自带的模块locale来检验命令行暗中同意编码和装置命令行编码。

import locale

#get 
locale.getdefaultlocale()
#('zh_CN', 'cp936')

#set
locale.setlocale(...)

#-*-coding:gb2312 -*- #其1也能够去掉
__author__ = ‘Alex Li’

print(unicode_to_utf-8)

汉字转Unicode编码

    pd_name = pd_name.decode('utf-8')
    print pd_name
    nname = ""
    for c in pd_name:
      c = "%%u%04X" % ord(c);
      nname += c
http://www.pythonclub.org/python-basic/codec

===========================
知识点:
===========================
1. unicode是一个编码字符集, 即为每个字符设定了一个对应的编码表, 至于如何存储字符的编码, 并没有做规定.  
utf-8/utf-16等编码即是unicode的具体存储实现方式, 其中utf-8也是最常用的方式.
2. GB2312、GBK、 GB18030既是编码字符集, 也是存储方式. 
3. 如果py文件加了# -*- coding: utf-8 -*-, 字符串默认将以utf-8编码存储, 而且Eclipse也很智能将文件也按照UTF-8存放.
4. 如果py文件加了from __future__ import unicode_literals, 本py文件中声明的字符串将按照unicode 类型.  
5. 对于py程序从DB取出汉字的过程, 涉及到两个不同世界的存储方式, 一般都需要先做decode, 将其转为unicode.
6. 如果使用的是Oracle数据库, 汉字若存在varchar字段, 要看NLS_CHARACTERSET设定值, 比如ZHS16GBK, 需要做decode('GBK');  
如果汉字存在NVARCHAR中, 要看 NLS_NCHAR_CHARACTERSET 的设定, 因为NLS_NCHAR_CHARACTERSET多设定为UTF8, python程序就不需要做转换了. 



===========================
延伸阅读:
===========================
如joel所讲, 每个开发人员都应该清楚unicode和char set知识, 推荐阮一峰的文章:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 
http://www.pythonclub.org/python-basic/encode-detail

字体编辑用中日韩汉字Unicode编码表
http://www.chi2ko.com/tool/CJK.htm

SO上unicode_literals的问答
http://stackoverflow.com/questions/809796/any-gotchas-using-unicode-literals-in-python-2-6

http://www.cnblogs.com/harrychinese/p/UnicodeDecodeError_utf8_codec_decode_issue.html

import sys
print(sys.getdefaultencoding())

 

编码的概念

编码就是将新闻从壹种格式调换到另壹种格式,Computer只认得2进制,轻易的明亮,将大家肉眼看到的文字转变为Computer能够辨识的二进制格式视为编码,而二进制以某种编码格式调换为我们能看的文字的长河能够看做是解码。既然计算机只可以认识二进制0,壹,那么大家用的假名、数字和文字等是怎么着和他们相应的吗?那就请继续看呢!

 python中查阅默许的编码标准是:

import sys
print(sys.getdefaultencoding())

#运行结果:
utf-8

 

msg = “小编爱香港(Hong Kong)西复门”
#msg_gb2312 = msg.decode(“utf-8”).encode(“gb2312”)
msg_gb2312 = msg.encode(“gb2312”)
#默许正是unicode,不用再decode,喜大普奔
gb2312_to_unicode = msg_gb2312.decode(“gb2312”)
gb2312_to_utf8 = msg_gb2312.decode(“gb2312”).encode(“utf-8”)

unicode向下包容gbk和此外语言,不用再行解码成gbk

ASCⅡ码

我们都知晓Computer是美利哥发明的,初阶的时候也只有美利坚同盟军那两国行使,而他们的言语仅仅只有2多少个假名组成,再加上部分标识,所以在1从头的时候,用的编码规则就是ASCⅡ码。ASCⅡ,普通话名称叫United States新闻调换规范代码,因为名称为American
Standard Code for Information Interchange,下边咱们来看看ASCⅡ表:

4858.com 2

ASCⅡ码用二个字节,也正是8人2进制组来标记叁个字符,比如00一千0一就代表字符!,第三版的ASCⅡ未有接纳最高的2个bit,所以取值范围为0-1二七,只可以表示12八字符。为了满足西欧等国家的字符供给,于是用上了最高位的bit,能表示的字符也从1二十二日增到了25几个。

 4858.com 3

在python中采用函数ord(),能够字符转变为对应数值,使用函数chr能够将数值调换为对应字符:

4858.com 4

>>> ord("a")     #将字符转换为数值
97
>>> ord("A")
65
>>> chr(65)
'A'
>>> chr(97)      #将数值转换为字符
'a'
>>>

4858.com 5

 

print(msg)
print(msg_gb2312)
print(gb2312_to_unicode)
print(gb2312_to_utf8)

 

GB2312和GBK

当计算机长途跋涉来到了炎黄,ASCⅡ已经不能知足自个儿大天朝的急需了,常用的方块字大概都有2k-三k。所以中夏族民共和国国标总部在一九柒七宣布了《音讯交流用汉字编码字符集》,也正是GB231③规范。GB231贰一共收音和录音了74四多少个字符(67陆16个汉字和6811个别的标识),包罗拉丁字母、希腊共和国(The Republic of Greece)字母和日文平假名等,基本上知足了国人的供给。

在GB2312中各样汉字使用七个字节来表示,分为高字节和低字节,汉字区高字节从B0-F7,低字节从A1-FE,占用的码位是7贰*94=6768,当中有伍个空位是D柒FA-D7FE,规定第二个字节大于127的就象征那是二个汉字的开始(那3个字节和下一个字节就意味着一当中华夏族民共和国字),每个字节的最高位都位1。

但是对于人名、古普通话等方面出现的罕用字,GB2312不可能管理,后来就出现了GBK。GBK向下包容GB2312,其编码范围从8140到FEFE(不包蕴xx7F),共23九318个码位,共收音和录音了贰十0一个汉字,那照旧非常的厉害的了。以后我们应用的计算机默许的便是GBK编码。

4858.com 6

 

 

 

Unicode和UTF-8

笔者们国家搞出了GBK,其余的国度也搞出了美妙绝伦的编码,比方小日本的SJIJ,宝岛黑龙江的BIG5,国际团队壹看,那可怜呀,种种地点都分别搞各自的,那么在分歧的国家之间就能够现出不兼容,小编用GBK编码格式写的软件,弄到你编码格式为SJIJ的计算机就不能够执行了。所以就涌出了Unicode,也称万国码。unicode是用二个字节来代表2个字符的,65536类个字符,那足以覆盖世界上具备的文字。

如此虽好,不过美利哥平民就不心情舒畅了,笔者多少个假名,举个例子’a’就必要占用2个字节,今后内需占用五个字节,那样就大大的浪费了内部存储器和硬盘的空中,全数新生就涌出了UTF-3二,UTF-1六和UTF-捌,前五个这里就不在敖述了,现在并不常用,大家这看看那一个UTF-8,UTF-捌是一种可变长的编码格式,存款和储蓄英文字母只必要3个字节,存款和储蓄汉字须要一个字节,但超大字符聚集的越来越大好些当中华人民共和国字要占6个字节。大家在内部存款和储蓄器里面包车型大巴数额是unicode,在传输数据和封存数据的时候利用UTF-八已节省空间和带宽。

 

计算: 无论在python二 照旧在python叁 中   都亟待先解码成为Unicode   然后
 再进行编码 (gbk ),可是由于python3中私下认可的正是Unicode  所以无需解码
,可以直接编码

 

Python2的编码

在python第22中学暗中认可的编码是ASCII,python二的字符串类型有三种:str和Unicode,那八个只是字符串类型的名字,大家重要看它们在内部存款和储蓄器里面的内部存款和储蓄器地址:

4858.com 7

#coding=utf8

name = '彬彬'
name2 = u'彬彬'   #加u,将字符串类型改为Unicode
print  repr(name)
print  repr(name2)

#输出结果

‘\xe5\xbd\xac\xe5\xbd\xac’   #字节数据
u’\u5f6c\u5f6c’              #Unicode数据

4858.com 8

 4858.com 9

在python第22中学,str类型字符串类型在内部存款和储蓄器中存款和储蓄的是bytes数据,Unicode类型字符串在内部存款和储蓄器中蕴藏的是unicode数据。这二种多少里面是如何关系了?这里就涉嫌到精晓码(encode)和编码(decode)了。

4858.com 10

#coding=utf8

name = '彬彬'                #name为字节数据类型
name2 = u'彬彬'            #name为unicode数据类型
print  repr(name)         
print repr(name2)
name3 = name.decode('utf8')  
print type(name3)
print repr(name3)
name4 = name2.encode('utf8')
print type(name4)
print repr(name4)

#运行结果

'\xe5\xbd\xac\xe5\xbd\xac'
u'\u5f6c\u5f6c'
<type 'unicode'>
u'\u5f6c\u5f6c'
<type 'str'>
'\xe5\xbd\xac\xe5\xbd\xac'

4858.com 11

由上运营结果能够,unicode调换为bytes数据的历程是编码。从bytes数据转变为unicode数据的长河是解码。大家再来看一下:

4858.com 12

#coding=utf8
name = '彬彬'
name3 = name.decode('big5')
print name3

#运行结果
敶砍蓮

4858.com 13

大家能够见见得到一批乱文,name存在内部存款和储蓄器里的时候是以UTF编码成的bytes数据,而大家这里decode(‘big5’)使用big5来解码,就算功成名就了,可是出口结果却不是我们想要的结果。

当大家把第一行coding改为big5的时候就不会出现乱文了,

4858.com 14

#coding=big5
name = '彬彬'
name3 = name.decode('big5')
print name3

#运行结果
彬彬

4858.com 15

于是大家用什么样规则编码的就要用怎么样区解码!

 4858.com 16

 注意:我们在顶峰展现出来的公开,正是你用户所见到的,其实都以曾经转变成unicode到内部存款和储蓄器里面,而bytes数据貌似都是Computer识其他。

 

 

python3中私下认可字符编码unicode  
   (文件编码暗中认可utf-8)

Python3的编码

在Python叁中也定义了二种档案的次序的字符串类型,str和bytes,str类型存款和储蓄unicode数据,bytes类型存款和储蓄bytes数据。

4858.com 17

4858.com 18

name = "彬彬"
name2 = b"hello"
print(type(name))
print(type(name.encode('utf8')))
print(type(name.encode('gbk')))
print(type(name2))
print(type(name2.decode('utf8')))

#运行结果
<class 'str'>
<class 'bytes'>
<class 'bytes'>
<class 'bytes'>
<class 'str'>

4858.com 19

如上运转结果,bytes转变为unicode为解码,uicode转为bytes数据类型为编码。

4858.com 20

 由上海教室所示,在区别的编码之间调换的时候,大家都要因而unicode那其中间转播站,不能够,尽管unicode老二哥强大呢,当大家想把utf-八编码的数量调换为gbk的,我们就需要把utf-八的数目先解码成unicode,再由unicode编码成gbk。

 在py2和py三中有个关键的界别正是,py二会自动把bytes数据解码成unicode,而py三就不会活动把bytes解码成unicode了。所以说py叁更明显的差距了bytes数据和unicode。

#py2中
print(u"liu" + "bin")

#运行结果
liubin

4858.com 21

#py3中
print("liu" + b"bin")
#运行结果
Traceback (most recent call last):
  File "E:/py/字符编码2.py", line 2, in <module>
    print("liu" + b"bin")
TypeError: Can't convert 'bytes' object to str implicitly

print("liu" + (b"bin").decode('utf8'))

#运行结果

  liubin

4858.com 22

 

 

 

 一个.py文件的”一生”

 那大家成立.py文件,到试行.py文件,这里面包车型大巴编码和平解决码是怎么来的吧?

一.当大家创设一个.py文件的时候,会有三个暗许的编码格式(这里以pycharm为例),在右下角,暗中同意是UTF-8,当然你也得以选取别的的编码:

4858.com 23

二.当大家在.py文件之中写入代码的时候,会以unicode的编码格式保存在内部存款和储蓄器中;

print("你好,世界!")

 

三.当大家保留的时候,会将Unicode数据编码成utf-八格式的数量,然后保留在硬盘里面;

四.当大家实行文书的时候,pycharm会调用python的解释器来读取文件,在py2中,暗中认可会以ASCII将代码解码成unicode数据,然而ASCII码并不认得中文,所以就能现出报错。

  File "E:/py/�ַ�����.py", line 2
SyntaxError: Non-ASCII character '\xe4' in file E:/py/�ַ�����.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

 

故而,在py第22中学,我们供给增添:

#coding=utf8
print("你好,世界!")

#运行结果
你好,世界!

可是在py三中就不设有这么些主题材料了,只要编码的时候适用的是UTF-8,python三默许的编码标准便是UTF-八,它会用UTF-8来将UTF-8的bytes数据解码成unicode,然后在计算机终端展现!

http://www.cnblogs.com/liubinsh/p/7001433.html

encode.py3

 

4858.com,s = “特斯拉”

print(s)

 

s_to_gbk = s.encode(“gbk”)

 

引进b:字节类型,是1种单独的数据类型,是3个0-25五之内的全体字的数据类型,——在python三中在编码的还要会将数据转变来bytes数据类型——

bytes类型需求学习

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有