1. ZeichenkodierungEinführung
1.1. ASCII
ASCII (American Standard Code for Information Interchange) ist eine Einzelbyte-Kodierung. Zu Beginn gab es in der Computerwelt nur Englisch, und ein einzelnes Byte kann 256 verschiedene Zeichen darstellen Alle englischen Zeichen und viele Steuersymbole, aber ASCII verwendet nur die Hälfte davon (unterhalb von x80), was auch die Grundlage für die Realisierung von MBCS darstellt
In der Computerwelt gab es jedoch bald der Welt, und Einzelbyte-ASCII konnte den Bedarf nicht mehr decken. Später entwickelte jede Sprache ihre eigene Kodierung, da es zu wenige Zeichen gab, die durch ein einzelnes Byte dargestellt werden konnten, und sie außerdem mit ASCII kompatibel sein musste Daher verwenden diese Codierungen Multibytes zur Darstellung von Zeichen, z. B. GBxxx, BIGxxx usw. Ihre Regel lautet: Wenn das erste Byte unter x80 liegt, stellt es immer noch ASCII-Zeichen dar. Wenn es über x80 liegt, folgt es Das nächste Byte zusammen (insgesamt zwei Bytes) stellt ein Zeichen dar, überspringt dann das nächste Byte und fährt mit der Beurteilung fort.
Hier hat IBM ein Konzept namens Codepage erfunden, um diese zu codieren GBK ist die Seite 936, also CP936. Der allgemeine Name lautet daher „GBK“. Daher wird es manchmal als DBCS (Double-Byte Character Set) bezeichnet. Es muss klar sein, dass es sich bei MBCS nicht um eine bestimmte Kodierung handelt Die Kodierung in
LinuxIn Windows können Sie die Zeichen MBCS nicht sehen, da Microsoft ANSI verwendet, um fremder zu sein. Die Kodierung ANSI im Dialogfeld „Speichern unter“ von Notepad ist Gleichzeitig bezieht es sich in der Standard-Gebietsschemaeinstellung von Windows auf GBK.
Später hatte ich das Gefühl, dass zu viele Codes die Welt zu komplex gemacht hatten und mir Kopfschmerzen bereiteten Wir saßen alle zusammen und überlegten uns eine Methode: Zeichen in allen Sprachen sollten durch denselben Zeichensatz dargestellt werden. Das ist Unicode Der ursprüngliche Unicode-Standard UCS. 2 verwendet zwei Bytes zur Darstellung eines Zeichens, daher hört man oft, dass Unicode zwei Bytes zur Darstellung eines Zeichens verwendet. Aber bald darauf waren einige Leute der Meinung, dass 256*256 zu wenig sei und immer noch nicht ausreiche, und so erschien der UCS-4-Standard, der 4 Bytes zur Darstellung eines Zeichens verwendet, aber der von uns am häufigsten verwendete ist immer noch UCS-2 .
UCS (Unicode Character Set) ist nur eine Tabelle von Codepunkten, die Zeichen entsprechen. Der Codepunkt des Wortes „汉“ ist beispielsweise 6C49. UTF (UCS Transformation Format) ist für die spezifische Übertragung und Speicherung von Zeichen verantwortlich.
Das ist zunächst sehr einfach, verwenden Sie einfach den UCS-Codepunkt zum direkten Speichern, also UTF-16. Beispielsweise kann „Han“ direkt mit x6Cx49 (UTF-16-BE) gespeichert werden umgekehrt. x49x6C speichern (UTF-16-LE). Aber nachdem sie es verwendet haben, haben die Amerikaner das Gefühl, dass sie einen großen Verlust erlitten haben. Früher brauchten englische Buchstaben nur ein Byte zum Speichern, aber jetzt sind es zwei Bytes, nachdem sie einen großen Topf gegessen haben, und der Platzverbrauch hat sich verdoppelt ... Also UTF-8 Aus dem Nichts. UTF-8 ist eine sehr umständliche Kodierung. Insbesondere ist es eine variable Länge und kompatibel mit ASCII-Zeichen, die durch 1 Byte dargestellt werden. Was hier weggelassen wird, muss jedoch an anderer Stelle extrahiert werden. Sie haben sicher gehört, dass chinesische Zeichen in UTF-8 zum Speichern 3 Bytes benötigen, oder? Die in 4 Bytes gespeicherten Zeichen sind noch tränenreicher ... (Bitte suchen Sie nach Details darüber, wie UCS-2 zu UTF-8 wurde)
Eine weitere erwähnenswerte Sache ist BOM (Byte Order Mark). Wenn wir die Datei speichern, wird die in der Datei verwendete Codierung nicht gespeichert. Beim Öffnen müssen wir uns die beim Speichern verwendete Codierung merken und sie mit dieser Codierung öffnen. (Vielleicht möchten Sie sagen, dass Notepad es Ihnen nicht erlaubt, beim Öffnen der Datei die Kodierung auszuwählen? Sie können genauso gut zuerst Notepad öffnen und dann Datei-> Öffnen verwenden, um sie anzuzeigen.) UTF führt BOM ein, um seine eigene Kodierung darzustellen eine davon, was bedeutet, dass die für den als nächstes zu lesenden Text verwendete Kodierung die entsprechende Kodierung ist:
BOM_UTF8 'xefxbbxbf'
BOM_UTF16_LE 'xffxfe'BOM_UTF16_BE 'xfexff'
Nicht alle
Editorenschreiben BOM, aber auch ohne BOM kann Unicode weiterhin gelesen werden, aber wie bei der MBCS-Kodierung muss die spezifische Kodierung separat angegeben werden, da sonst die Dekodierung fehlschlägt.
Sie haben vielleicht gehört, dass UTF-8 kein BOM erfordert. Das stimmt nicht, aber die meisten Editoren lesen UTF-8 als Standardkodierung, wenn kein BOM vorhanden ist. Sogar Notepad, das beim Speichern standardmäßig ANSI (MBCS) verwendet, verwendet zuerst die UTF-8-Testkodierung, wenn die Datei liest. Wenn sie erfolgreich dekodiert werden kann, wird UTF-8 zum Dekodieren verwendet. Dieser umständliche Ansatz von Notepad hat einen Fehler verursacht: Wenn Sie eine neue Textdatei erstellen, „姹姧“ eingeben und sie dann mit ANSI (MBCS) speichern, wird sie beim erneuten Öffnen zu „Han a“. Probieren Sie es aus:)
2. Kodierungsprobleme in Python
2.1. str und UnicodeStr und Unicode sind beide Unterklassen von Basestring . Genau genommen handelt es sich bei str tatsächlich um eine Bytefolge, bei der es sich um eine Folge von Unicode-codierten Bytes handelt. Bei Verwendung der Funktion len()Unicode ist die echte Werfen wir einen Blick auf die beiden Basisstring-Instanzmethoden encode() und decode() Nachdem wir den Unterschied zwischen str und unicode verstanden haben, werden diese beiden Methoden nicht mehr verwechselt:# coding: UTF-8 u = u'汉' print repr(u) # u'\u6c49' s = u.encode('UTF-8') print repr(s) # '\xe6\xb1\x89' u2 = s.decode('UTF-8') print repr(u2) # u'\u6c49' # 对unicode进行解码是错误的 # s2 = u.decode('UTF-8') # 同样,对str进行编码也是错误的 # u2 = s.encode('UTF-8')
#-*- coding: UTF-8 -*-
# coding: UTF-8 f = open('test.txt') s = f.read() f.close() print type(s) # <type 'str'> # 已知是GBK编码,解码成unicode u = s.decode('GBK') f = open('test.txt', 'w') # 编码成UTF-8编码的str s = u.encode('UTF-8') f.write(s) f.close()
# coding: GBK import codecs f = codecs.open('test.txt', encoding='UTF-8') u = f.read() f.close() print type(u) # <type 'unicode'> f = codecs.open('test.txt', 'a', encoding='UTF-8') # 写入unicode f.write(u) # 写入str,自动进行解码编码操作 # GBK编码的str s = '汉' print repr(s) # '\xba\xba' # 这里会先将GBK编码的str解码为unicode再编码为UTF-8写入 f.write(s) f.close()
# coding:gbk import sys import locale def p(f): print '%s.%s(): %s' % (f.module, f.name, f()) # 返回当前系统所使用的默认字符编码 p(sys.getdefaultencoding) # 返回用于转换Unicode文件名至系统文件名所使用的编码 p(sys.getfilesystemencoding) # 获取默认的区域设置并返回元祖(语言, 编码) p(locale.getdefaultlocale) # 返回用户设定的文本数据编码 # 文档提到this function only returns a guess p(locale.getpreferredencoding) # \xba\xba是'汉'的GBK编码 # mbcs是不推荐使用的编码,这里仅作测试表明为什么不应该用 print r"'\xba\xba'.decode('mbcs'):", repr('\xba\xba'.decode('mbcs')) #在笔者的Windows上的结果(区域设置为中文(简体, 中国)) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp936') #locale.getpreferredencoding(): cp936 #'\xba\xba'.decode('mbcs'): u'\u6c49'
#中文(简体, 中国) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp936') #locale.getpreferredencoding(): cp936 #'\xba\xba'.decode('mbcs'): u'\u6c49' #英语(美国) #sys.getdefaultencoding(): UTF-8 #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp1252') #locale.getpreferredencoding(): cp1252 #'\xba\xba'.decode('mbcs'): u'\xba\xba' #德语(德国) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp1252') #locale.getpreferredencoding(): cp1252 #'\xba\xba'.decode('mbcs'): u'\xba\xba' #日语(日本) #sys.getdefaultencoding(): gbk #sys.getfilesystemencoding(): mbcs #locale.getdefaultlocale(): ('zh_CN', 'cp932') #locale.getpreferredencoding(): cp932 #'\xba\xba'.decode('mbcs'): u'\uff7a\uff7a'
可见,更改区域后,使用mbcs解码得到了不正确的结果,所以,当我们需要使用'GBK'时,应该直接写'GBK',不要写成'MBCS'。
UTF-16同理,虽然绝大多数操作系统中'UTF-16'是'UTF-16-LE'的同义词,但直接写'UTF-16-LE'只是多写3个字符而已,而万一某个操作系统中'UTF-16'变成了'UTF-16-BE'的同义词,就会有错误的结果。实际上,UTF-16用的相当少,但用到的时候还是需要注意。
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Python-Zeichenkodierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!