>  기사  >  백엔드 개발  >  Python 코딩 요약(인코딩 유형, 형식, 트랜스코딩)

Python 코딩 요약(인코딩 유형, 형식, 트랜스코딩)

高洛峰
高洛峰원래의
2017-03-01 13:30:261656검색

이 글은 파이썬 코딩을 자세하게 정리한 것입니다. 참고를 위해 다음과 같이 모든 사람과 공유하십시오.

[소위 유니코드]

유니코드는 기호 세트와 유사한 추상 인코딩입니다. 규정만 있습니다. 기호의 이진 코드가 포함되어 있지만 이 이진 코드를 저장하는 방법은 지정하지 않습니다. 즉, 내부 표현일 뿐이며 직접 저장할 수 없습니다. 따라서 저장할 때 utf-8, utf-16 등의 저장 형식을 지정해야 합니다. 이론적으로 유니코드는 전 세계 모든 언어를 수용할 수 있는 인코딩 체계입니다. (다른 인코딩 형식에 대해서는 자세한 내용 없음)

[소위 GB 코드]

GB는 "국가 표준", 즉 인민의 국가 표준을 의미합니다. 중화민국. GB 코드는 GB2312(GB2312-80), GBK, GB18030을 포함한 한자에 대한 코딩입니다. 표현 범위는 작은 것부터 큰 것까지 증가하며 기본적으로 이전 버전과 호환됩니다. 게다가 우리는 CP936이라는 코드를 자주 접하는데, 실제로는 대략 GBK라고 볼 수 있다.

[인코딩 판단]

1. isinstance(s, str)을 사용하여 문자열이 일반 문자열인지 확인합니다(str은 ASCII 형식 문자열, utf- 8, utf-16, GB2312, GBK 등은 모두 ASCII 형식 문자열입니다.

isinstance(s, unicode)를 사용하여 문자열이 유니코드 인코딩 문자열인지 확인합니다(유니코드 인코딩 문자열은 유니코드입니다). 문자열)을 입력합니다.

2. type() 또는 .__class__ 사용

인코딩이 올바른 경우:

예: stra = "中", type(stra)의 결과를 사용합니다. ) 이며 ASCII 유형 문자열

을 나타냅니다. 예를 들어 strb = u"中"이면 type(strb)를 사용한 결과는 , 유니코드 유형 문자열을 나타냅니다.


tmp_str = 'tmp_str'
print tmp_str.__class__   #<type &#39;str&#39;>
print type(tmp_str)    #<type &#39;str&#39;>
print type(tmp_str).__name__ #str
tmp_str = u&#39;tmp_str&#39;
print tmp_str.__class__   #<type &#39;unicode&#39;>
print type(tmp_str)    #<type &#39;unicode&#39;>
print type(tmp_str).__name__ #unicode


3. 가장 좋은 방법은 특히 HTML 페이지 가져오기와 같은 웹 관련 작업에서 chardet 판단을 사용하는 것입니다. 콘텐츠에 들어오면 페이지의 charset 태그는 인코딩만 표시하는데, 이는 때때로 부정확할 수 있으며, 페이지 콘텐츠의 일부 중국어 문자가 인코딩 범위를 초과할 수 있습니다. 이 경우, charset 감지를 사용하는 것이 가장 편리하고 정확합니다. .

(1) 설치 방법: chardet을 다운로드한 후 Python 설치 디렉터리의 Libsite-packages 디렉터리에 압축을 푼 chardet 폴더를 넣고 프로그램에서 import chardet을 사용합니다.

(2) 방법 1: 모든 콘텐츠를 감지하여 인코딩 결정


import urllib2
import chardet
res = urllib2.urlopen(&#39;http://www.php.cn&#39;)
res_cont = res.read()
res.close()
print chardet.detect(res_cont) #{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}


감지 함수는 값을 반환합니다. 2개의 키-값 쌍으로 구성된 사전을 포함하며 첫 번째는 감지 신뢰도이고 두 번째는 감지된 인코딩 형식입니다.

(3) 방법 2: 내용의 일부를 감지해 인코딩을 판단하고 속도를 높인다


import urllib2
from chardet.universaldetector import UniversalDetector
res = urllib2.urlopen(&#39;http://www.php.cn&#39;)
detector = UniversalDetector()
for line in res.readlines():
 #detect untill reach threshold
 detector.feed(line)
 if detector.done:
  break
detector.close()
res.close()
print detector.result
#{&#39;confidence&#39;: 0.99, &#39;encoding&#39;: &#39;utf-8&#39;}


【 인코딩 변환】

1. 특정 인코딩(ISO-8859-1 [ASCII 코드], utf-8, utf-16, GBK, GB2312 등)을 유니코드로 변환합니다. , unicode( s, charset) 또는 s.decode(charset)를 직접 사용합니다. 여기서 charset은 s의 인코딩입니다(유니코드는 decode()를 사용할 때 오류가 발생합니다). >

#将任意字符串转换为unicode
def to_unicode(s, encoding):
 if isinstance(s, unicode):
  return s
 else:
  return unicode(s, encoding)


참고: 디코딩()할 때 잘못된 문자가 발견되면(예: 비표준 전폭 공백 xa3xa0 또는 xa4x57, 실제 전폭 공백은 xa1xa1입니다) ) 오류가 보고됩니다.


해결책: '무시' 모드를 사용하세요. 즉, stra.decode('...', 'ignore').encode('utf-8')입니다.

설명: decode의 함수 프로토타입은 decode([encoding],[errors='strict'])이며 두 번째 매개변수를 사용하여 오류 처리 전략을 제어할 수 있습니다.

기본 매개변수는 엄격합니다. 즉, 잘못된 문자가 발견되면 예외가 발생합니다. 대체하도록 설정된 경우 잘못된 문자는 ?로 대체됩니다. xmlcharrefreplace 로 설정한 다음 XML 문자 참조를 사용하십시오.

2. 유니코드에서 특정 인코딩으로 변환하려면 s.encode(charset)도 직접 사용됩니다. 여기서 s는 유니코드 인코딩이고 charset은 특정 인코딩입니다(유니코드가 아닌 경우 오류가 발생합니다). encode())를 사용할 때 ;

3. 당연히 하나의 특정 인코딩에서 다른 특정 인코딩으로 변환할 때 먼저 유니코드로 디코딩한 다음 최종 인코딩으로 인코딩할 수 있습니다.

[python 명령줄 인코딩(시스템 인코딩)]

파이썬과 함께 제공되는 로케일 모듈을 사용하여 명령줄의 기본 인코딩(즉, 시스템 인코딩) 및 명령줄 인코딩 설정:

import locale
#get coding type
print locale.getdefaultlocale() #(&#39;zh_CN&#39;, &#39;cp936&#39;)
#set coding type
locale.setlocale(locale.LC_ALL, locale=&#39;zh_CN.GB2312&#39;)
print locale.getlocale() #(&#39;zh_CN&#39;, &#39;gb2312&#39;)


는 현재 시스템의 내부 인코딩이 cp936임을 나타냅니다. GBK에. 실제로 중국 XP와 WIN7의 내부 시스템 인코딩은 cp936(GBK)입니다.


[파이썬 코드에서의 인코딩]

1. 파이썬 코드의 문자열이 인코딩으로 지정되지 않은 경우 기본 인코딩은 코드의 인코딩과 동일합니다. 파일 자체는 일관성이 있습니다. 예를 들어 문자열 str = 'English'가 utf8로 인코딩된 코드 파일에 있으면 문자열은 utf8로 인코딩됩니다. gb2312 파일에 있으면 문자열은 gb2312로 인코딩됩니다. 그렇다면 코드 파일 자체의 인코딩을 어떻게 알 수 있습니까? (1) 코드 파일의 인코딩을 직접 지정: 코드 파일 헤드에 "#-*-coding:utf-8 -*-"를 추가하여 코드 파일이 utf-8임을 선언합니다. 인코딩되었습니다. 이때, 인코딩이 지정되지 않은 문자열의 인코딩은 utf-8이 됩니다.

(2)在没有指定代码文件的编码时,创建代码文件时使用的是python默认采用的编码(一般来说是ascii码,在windows中实际保存为cp936(GBK)编码)。通过sys.getdefaultencoding()和sys.setdefaultencoding('...')来获取和设置该默认编码。


import sys
reload(sys)
print sys.getdefaultencoding() #ascii
sys.setdefaultencoding(&#39;utf-8&#39;)
print sys.getdefaultencoding() #utf-8


结合(1)和(2)做个试验:指定代码文件编码为utf-8时,用notepad++打开显示的是utf-8无DOM编码;未指定代码文件编码时,用notepad++打开显示的是ANSI编码(压缩编码,默认的保存编码形式)。

Python 코딩 요약(인코딩 유형, 형식, 트랜스코딩)

(3)如何永久地将python默认采用的编码设置为utf-8呢?有2种方法:

第一个方法:编辑site.py,修改setencoding()函数,强制设置为 utf-8;

第二个方法:增加一个名为 sitecustomize.py的文件,存放在安装目录下的\Lib\site-packages目录下

sitecustomize.py是在site.py被import执行的,因为 sys.setdefaultencoding()是在site.py的结尾处被删除的,所以可以在 sitecustomize.py使用 sys.setdefaultencoding()。

2、python代码中的字符串如果被指定了编码,举个例子:str = u'中文',该字符串的编码被指定为unicode(即python的内部编码)。

(1)这里有个误区需要注意!假如在py文件中有如下代码:


stra = u"中"
print stra.encode("gbk")


按上面说的stra是unicode形式,直接encode称gbk编码应该没问题啊?但是实际执行时会报错“UnicodeEncodeError: 'gbk' codec can't encode character u'\xd6' in position 0: illegal multibyte sequence”。

原因在于:python解释器在导入python代码文件并执行时,会先查看文件头有没有编码声明(例如#coding:gbk等)。如果发现声明,会将文件中的字符串都先解释成unicode的形式(这里先用默认编码gbk(cp936)将stra解码成unicode编码'd6d0'后保存),之后执行stra.encode('gbk')时,由于stra已经是unicode编码且'd6d0'在gbk的编码范围内,所以编码不会出现错误;如果文件头没有编码声明,则不会进行上述过程中的解码操作(这里就直接使用stra的unicode编码'd6'),之后执行stra.encode('gbk')时,由于'd6'不在gbk的编码范围所以报错。

(2)为避免这种类型的错误,最好在代码文件头上声明编码,或者麻烦点每次使用setdefaultencoding()。

(3)总的来说就是unicode是python解释器的内码,所有代码文件在导入并执行时,python解释器会先将字符串使用你指定的编码形式解码成unicode,然后再进行各种操作。所以不管是对字符串的操作,还是正则表达式,还是读写文件等等最好都通过unicode来进行。

【python中其他编码】

文件系统的编码:sys.getfilesystemencoding()
终端的输入编码:sys.stdin.encoding
终端的输出编码:sys.stdout.encoding

更多Python 코딩 요약(인코딩 유형, 형식, 트랜스코딩)相关文章请关注PHP中文网!

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