Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der Python-Codierung (Codierungstyp, Format, Transcodierung)

Zusammenfassung der Python-Codierung (Codierungstyp, Format, Transcodierung)

高洛峰
高洛峰Original
2017-03-01 13:30:261656Durchsuche

Dieser Artikel fasst die Python-Codierung im Detail zusammen. Teilen Sie es wie folgt als Referenz mit allen:

[Sogenannter Unicode]

Unicode ist eine abstrakte Kodierung ähnlich einem Symbolsatz, der legt nur fest Es enthält den Binärcode des Symbols, gibt jedoch nicht an, wie dieser Binärcode gespeichert werden soll. Das heißt, es handelt sich nur um eine interne Darstellung und kann nicht direkt gespeichert werden. Daher muss beim Speichern ein Speicherformat angegeben werden, z. B. utf-8 und utf-16 usw. Theoretisch ist Unicode ein Codierungsschema, das alle Sprachen der Welt unterstützen kann. (Keine weiteren Details zu anderen Kodierungsformaten)

[Sogenannter GB-Code]

GB bedeutet „nationaler Standard“, also der nationale Standard des Volkes Republik China. GB-Code ist eine Kodierung für chinesische Zeichen, einschließlich GB2312 (GB2312-80), GBK und GB18030. Der Darstellungsbereich nimmt von klein nach groß zu und ist grundsätzlich abwärtskompatibel. Darüber hinaus stoßen wir häufig auf einen Code namens CP936, der eigentlich grob als GBK angesehen werden kann.

[Kodierung beurteilen]

1. Verwenden Sie isinstance(s, str), um zu bestimmen, ob eine Zeichenfolge eine allgemeine Zeichenfolge ist (str ist eine Zeichenfolge vom Typ ASCII, utf-). 8, utf-16, GB2312, GBK usw. sind alle Zeichenfolgen vom Typ ASCII.

Verwenden Sie isinstance(s, unicode), um zu bestimmen, ob eine Zeichenfolge eine Unicode-Codierungszeichenfolge ist (Unicode-Codierung Die Zeichenfolge ist ein Unicode Typ string).

2. Verwenden Sie type() oder .__class__

Wenn die Kodierung korrekt ist:

Zum Beispiel: stra = "中", dann verwenden Sie das Ergebnis von type(stra ) Es ist , was auf eine Zeichenfolge vom Typ ASCII hinweist

Zum Beispiel: strb = u"中", dann ist das Ergebnis der Verwendung von type(strb) , Gibt eine Zeichenfolge vom Typ Unicode an.


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. Der beste Weg ist, Chardet-Urteil zu verwenden, insbesondere bei webbezogenen Vorgängen wie dem Crawlen Beim HTML-Seiteninhalt gibt das Zeichensatz-Tag der Seite nur die Kodierung an, die manchmal falsch ist, und einige chinesische Zeichen im Seiteninhalt können den Kodierungsbereich überschreiten. In diesem Fall ist es am bequemsten und genauesten, die Zeichensatzerkennung zu verwenden .

(1) Installationsmethode: Legen Sie nach dem Herunterladen von Chardet den dekomprimierten Chardet-Ordner im Verzeichnis Libsite-packages des Python-Installationsverzeichnisses ab und verwenden Sie import chardet im Programm.

(2) Methode 1: Erkennen Sie alle Inhalte, um die Codierung zu bestimmen


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;}


Der Rückgabewert von Die Erkennungsfunktion ist ein Wörterbuch mit zwei Schlüssel-Wert-Paaren, das erste ist die Erkennungskonfidenz und das zweite die erkannte Codierungsform.

(3) Methode 2: Erkennen Sie einen Teil des Inhalts, um die Codierung zu bestimmen und die Geschwindigkeit zu verbessern


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;}


【Kodierung konvertieren】

1. Konvertieren von einer bestimmten Kodierung (ISO-8859-1 [ASCII-Code], utf-8, utf-16, GBK, GB2312 usw.) in Unicode und verwenden Sie es direkt unicode(s, charset) oder s.decode(charset), wobei charset die Kodierung von s ist (beachten Sie, dass Unicode bei Verwendung von decode() einen Fehler macht); 🎜>


#将任意字符串转换为unicode
def to_unicode(s, encoding):
 if isinstance(s, unicode):
  return s
 else:
  return unicode(s, encoding)
Hinweis: Wenn beim Dekodieren () ein unzulässiges Zeichen auftritt (z. B. nicht standardmäßiges Leerzeichen in voller Breite xa3xa0 oder xa4x57, wird die tatsächliche volle Breite angezeigt). Leerzeichen ist xa1xa1), wird ein Fehler gemeldet.


Lösung: Verwenden Sie den Modus „Ignorieren“, also: stra.decode('...', 'ignore').encode('utf-8').

Erklärung: Der Funktionsprototyp von decode ist decode([encoding],[errors='strict']), und der zweite Parameter kann zur Steuerung der Fehlerbehandlungsstrategie verwendet werden.

Der Standardparameter ist strikt, was bedeutet, dass eine Ausnahme ausgelöst wird, wenn er auf „Ignorieren“ gesetzt ist; wenn er auf „Ersetzen“ eingestellt ist, werden illegale Zeichen durch „?“ ersetzt auf xmlcharrefreplace setzen und dann XML-Zeichenverweise verwenden.

2. Um von Unicode in eine bestimmte Kodierung zu konvertieren, verwenden Sie s.encode(charset) direkt, wobei s die Unicode-Kodierung und charset die spezifische Kodierung ist (beachten Sie, dass bei der Verwendung von Nicht-Unicode ein Fehler auftritt encode()) ;

3. Natürlich können Sie beim Konvertieren von einer bestimmten Kodierung in eine andere bestimmte Kodierung zuerst in Unicode dekodieren und dann in die endgültige Kodierung kodieren.

[Python-Befehlszeilenkodierung (Systemkodierung)]

Verwenden Sie das mit Python gelieferte Locale-Modul, um die Standardkodierung der Befehlszeile zu erkennen (d. h. die Systemkodierung) und Legen Sie die Befehlszeilenkodierung fest:


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;)
gibt an, dass die interne Kodierung des aktuellen Systems cp936 ist ähnelt GBK. Tatsächlich ist die interne Systemkodierung von chinesischem XP und WIN7 cp936 (GBK).


[Codierung im Python-Code]

1 Wenn die Zeichenfolge im Python-Code nicht mit Codierung angegeben ist, ist die Standardcodierung dieselbe wie die Codierung des Codes Datei selbst konsistent. Beispiel: Wenn die Zeichenfolge str = 'Chinese' in einer utf8-codierten Codedatei enthalten ist, ist die Zeichenfolge utf8-codiert. Wenn sie sich in einer gb2312-Datei befindet, ist die Zeichenfolge gb2312-codiert. Woher kennen Sie also die Codierung der Codedatei selbst? (1) Geben Sie die Kodierung der Codedatei selbst an: Fügen Sie „#-*-coding:utf-8 -*-“ zum Kopf der Codedatei hinzu, um zu deklarieren, dass die Codedatei utf-8 ist codiert. Zu diesem Zeitpunkt wird die Codierung von Zeichenfolgen, deren Codierung nicht angegeben ist, zu 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编码(压缩编码,默认的保存编码形式)。

Zusammenfassung der Python-Codierung (Codierungstyp, Format, Transcodierung)

(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

更多Zusammenfassung der Python-Codierung (Codierungstyp, Format, Transcodierung)相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn