>  기사  >  백엔드 개발  >  코딩 비밀(파이썬 버전)

코딩 비밀(파이썬 버전)

巴扎黑
巴扎黑원래의
2017-06-23 15:49:301238검색

코딩(파이썬 버전)

최근 파이썬을 배우는 과정에서 코딩이 달라서 조금 헷갈려서 선배님들이 남겨주신 문서도 읽고 나름의 이해도를 더해 적어볼 준비를 했습니다. 코딩에 어려움을 겪고 있는 분들을 위해 공유합니다.

인코딩의 개념

인코딩은 정보를 한 형식에서 다른 형식으로 변환하는 것입니다. 간단한 이해는 우리 눈에 보이는 텍스트를 컴퓨터가 인식할 수 있는 바이너리 형식으로 변환하는 것입니다. . 이는 인코딩으로 간주되며, 바이너리를 특정 인코딩 형식으로 읽을 수 있는 텍스트로 변환하는 과정은 디코딩으로 간주될 수 있습니다. 컴퓨터는 이진수 0과 1만 인식할 수 있는데, 우리가 사용하는 문자, 숫자, 단어는 어떻게 이에 대응됩니까? 그럼 계속해서 읽어주세요!

Python의 기본 인코딩 표준은 다음과 같습니다.

import sysprint(sys.getdefaultencoding())#运行结果:utf-8

ASCII 코드

우리 모두는 컴퓨터가 처음에는 미국에서 발명되었다는 것을 알고 있습니다. 그리고 그들의 언어는 단지 26개의 문자와 일부 기호로만 구성되어 있으므로 처음에는 사용된 인코딩 규칙이 ASCII 코드였습니다. ASCⅡ, 중국어 이름은 미국 정보 교환용 미국 표준 코드(American Standard Code for Information Interchange)라고 합니다. ASCⅡ 표를 살펴보겠습니다.

ASCII 코드는 8바이트를 사용합니다. -bit 이진 그룹. 문자를 식별합니다. 예를 들어 00100001은 문자 를 나타냅니다. , ASCII의 첫 번째 버전은 최상위 비트를 사용하지 않았으므로 값 범위는 0-127이며 128자만 표현할 수 있습니다. 서유럽 및 기타 국가의 문자 요구 사항을 충족하기 위해 가장 높은 비트를 사용했으며 표현할 수 있는 문자 수를 128자에서 256자로 늘렸습니다.

문자를 해당 숫자 값으로 변환하려면 Python의 ord() 함수를 사용하고, 숫자 값을 해당 문자로 변환하려면 chr 함수를 사용하세요.

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

 

GB2312和GBK

当计算机漂洋过海来到了中国,ASCⅡ已经不能满足我大天朝的需求了,常用的汉字大致都有2k-3k。所以中国国家标准总局在1980发布了《信息交换用汉字编码字符集》,也就是GB2313标准。GB2312一共收录了7445个字符(6763个汉字和682个其他符号),包括拉丁字母、希腊字母和日文平假名等,基本上满足了国人的需求。

在GB2312中每个汉字使用两个字节来表示,分为高字节和低字节,汉字区高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768,其中有5个空位是D7FA-D7FE,规定第一个字节大于127的就代表这是一个汉字的开始(这一个字节和下一个字节就代表一个汉字),每个字节的最高位都位1。

但是对于人名、古汉语等方面出现的罕用字,GB2312不能处理,后来就出现了GBK。GBK向下兼容GB2312,其编码范围从8140到FEFE(不包括xx7F),共23940个码位,共收录了21003个汉字,这还是很厉害的了。现在我们使用的计算机默认的就是GBK编码。

 

Unicode和UTF-8

我们国家搞出了GBK,其他的国家也搞出了各种各样的编码,比如小日本的SJIJ,宝岛台湾的BIG5,国际组织一看,这不行啊,每个地方都各自搞各自的,那么在不同的国家之间就会出现不兼容,我用GBK编码格式写的软件,弄到你编码格式为SJIJ的计算机就不能执行了。所以就出现了Unicode,也称万国码。unicode是用2个字节来表示一个字符的,65536类个字符,这足以覆盖世界上所有的文字。

这样虽好,但是美国人民就不开心了,我一个字母,比如'a'就需要占用一个字节,现在需要占用两个字节,这样就大大的浪费了内存和硬盘的空间,所有后来就出现了UTF-32,UTF-16和UTF-8,前两个这里就不在敖述了,现在并不常用,我们这看看这个UTF-8,UTF-8是一种可变长的编码格式,存储英文字母只需要一个字节,存储汉字需要3个字节,但超大字符集中的更大多数汉字要占4个字节。我们在内存里面的数据是unicode,在传输数据和保存数据的时候使用UTF-8已节省空间和带宽。

 

Python2的编码

在python2中默认的编码是ASCII,python2的字符串类型有两种:str和Unicode,这两个只是字符串类型的名字,我们主要看它们在内存里面的内存地址:

= = u    repr(name2)

#输出结果

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

 

在python2中,str类型字符串类型在内存中存储的是bytes数据,Unicode类型字符串在内存中存储的是unicode数据。那两种数据之间是什么关系了?这里就涉及到了解码(encode)和编码(decode)了。

=                 name2 = u            = name.decode(= name2.encode(<type ><type >

由上运行结果可知,unicode转换为bytes数据的过程是编码。从bytes数据转换为unicode数据的过程是解码。我们再来看一下:

#coding=utf8name = '彬彬'name3 = name.decode('big5')print name3#运行结果敶砍蓮

我们可以看到得到一堆乱文,name存在内存里的时候是以UTF编码成的bytes数据,而我们这里decode('big5')使用big5来解码,虽然成功了,但是输出结果却不是我们想要的结果。

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

#coding=big5name = '彬彬'name3 = name.decode('big5')print name3#运行结果彬彬

所以我们用什么规则编码的就要用什么区解码!

 

 注意:我们在终端显示出来的明文,就是你用户所看到的,其实都是已经转换成unicode到内存里面,而bytes数据一般都是计算机识别的。

 

Python3的编码

在Python3中也定义了2种类型的字符串类型,str和bytes,str类型存储unicode数据,bytes类型存储bytes数据。

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 &#39;str&#39;>
<class &#39;bytes&#39;>
<class &#39;bytes&#39;>
<class &#39;bytes&#39;>
<class &#39;str&#39;>

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

 由上图所示,在不同的编码之间转换的时候,我们都要经过unicode这个中转站,没办法,虽然unicode老大哥强大呢,当我们想把utf-8编码的数据转换为gbk的,我们就需要把utf-8的数据先解码成unicode,再由unicode编码成gbk。

 在py2和py3中有个重要的区分就是,py2会自动把bytes数据解码成unicode,而py3就不会自动把bytes解码成unicode了。所以说py3更清晰的区分了bytes数据和unicode。

#py2中print(u"liu" + "bin")#运行结果liubin
( + b, line 2,  <module>( + bbytes
print("liu" + (b"bin").decode('utf8'))

#运行结果

  liubin

 

 

 一个.py文件的"一生"

 那我们创建.py文件,到执行.py文件,这里面的编码和解码是怎么来的呢?

1.当我们创建一个.py文件的时候,会有一个默认的编码格式(这里以pycharm为例),在右下角,默认是UTF-8,当然你也可以选择其他的编码:

2.当我们在.py文件里面写入代码的时候,会以unicode的编码格式保存在内存中;

print("你好,世界!")

 

3.当我们保存的时候,会将Unicode数据编码成utf-8格式的数据,然后保存在硬盘里面;

4.当我们执行文件的时候,pycharm会调用python的解释器来读取文件,在py2中,默认会以ASCII将代码解码成unicode数据,但是ASCII码并不认识中文,所以就会出现报错。

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

 

所以,在py2中,我们需要加上:

#coding=utf8print("你好,世界!")#运行结果你好,世界!

但是在py3中就不存在这个问题了,只要编码的时候适用的是UTF-8,python3默认的编码规范就是UTF-8,它会用UTF-8来将UTF-8的bytes数据解码成unicode,然后在计算机终端显示!

 

위 내용은 코딩 비밀(파이썬 버전)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.