이 글은 파이썬 코딩을 자세하게 정리한 것입니다. 참고를 위해 다음과 같이 모든 사람과 공유하십시오.
[소위 유니코드]
유니코드는 기호 세트와 유사한 추상 인코딩입니다. 규정만 있습니다. 기호의 이진 코드가 포함되어 있지만 이 이진 코드를 저장하는 방법은 지정하지 않습니다. 즉, 내부 표현일 뿐이며 직접 저장할 수 없습니다. 따라서 저장할 때 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)의 결과를 사용합니다. )
을 나타냅니다. 예를 들어 strb = u"中"이면 type(strb)를 사용한 결과는
tmp_str = 'tmp_str' print tmp_str.__class__ #<type 'str'> print type(tmp_str) #<type 'str'> print type(tmp_str).__name__ #str tmp_str = u'tmp_str' print tmp_str.__class__ #<type 'unicode'> print type(tmp_str) #<type 'unicode'> 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('http://www.php.cn') res_cont = res.read() res.close() print chardet.detect(res_cont) #{'confidence': 0.99, 'encoding': 'utf-8'}
감지 함수는 값을 반환합니다. 2개의 키-값 쌍으로 구성된 사전을 포함하며 첫 번째는 감지 신뢰도이고 두 번째는 감지된 인코딩 형식입니다.
(3) 방법 2: 내용의 일부를 감지해 인코딩을 판단하고 속도를 높인다
import urllib2 from chardet.universaldetector import UniversalDetector res = urllib2.urlopen('http://www.php.cn') 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 #{'confidence': 0.99, 'encoding': 'utf-8'}
【 인코딩 변환】
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)
해결책: '무시' 모드를 사용하세요. 즉, 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() #('zh_CN', 'cp936') #set coding type locale.setlocale(locale.LC_ALL, locale='zh_CN.GB2312') print locale.getlocale() #('zh_CN', 'gb2312')
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('utf-8') print sys.getdefaultencoding() #utf-8
结合(1)和(2)做个试验:指定代码文件编码为utf-8时,用notepad++打开显示的是utf-8无DOM编码;未指定代码文件编码时,用notepad++打开显示的是ANSI编码(压缩编码,默认的保存编码形式)。
(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中文网!