Literale Objekte in Python
Zu den Objekten, die Text in Python 3.x verarbeiten, gehören str, bytes und bytearray.
bytes und bytearray können fast alle str verwenden, mit Ausnahme der zur Formatierung verwendeten Methoden (format, format_map) und mehrerer spezieller Unicode-basierter Methoden (casefold, isdecimal, isidentifier, isnumeric, isPRintable, encode).
bytes verfügt über eine Klassenmethode, die eine Zeichenfolge durch Sequenzen erstellen kann, diese Methode kann jedoch nicht für str verwendet werden.
>>> b = bytes.fromhex('E4 B8 AD')
>>> b'xe4xb8xad'
>>> b.decode('utf-8')
'中'
>>> str(b)
"b'\xe4\xb8\xad'"
65
>>> ord('中')
>>> chr(65)
'A'
>>> chr(20013)
'中'
len-Funktion zählt die Anzahl der Zeichen, nicht die Anzahl der Bytes
>>> len('中')
1>>> '中'.encode('utf-8')
b'xe4xb8xad '
>>> len('中'.encode('utf-8')) #Berechnet die Länge des Bytes-Objekts, das 3 ganzzahlige Zeichen enthält
3
Python und Codierung
Die Art und Weise, wie Python intern mit der Codierung umgeht
Wenn Python unsere Eingaben akzeptiert, werden diese immer zuerst in Unicode konvertiert. Und je früher dieser Prozess stattfindet, desto besser.
Dann wird die Python-Verarbeitung immer auf Unicode durchgeführt. Während dieses Prozesses darf keine Kodierungskonvertierung durchgeführt werden.Wenn Python Ergebnisse an uns zurückgibt, werden diese immer von Unicode in die von uns benötigte Codierung konvertiert. Und je später dieser Prozess stattfindet, desto besser.
Kodierungsmethode des Python-Quellcodes
Python verwendet standardmäßig die UTF-8-Kodierung.
Wenn wir eine andere Kodierung zum Speichern von Python-Code verwenden möchten, können wir eine Kodierungsdeklaration in der ersten oder zweiten Zeile jeder Datei platzieren (wenn die erste Zeile durch den Hash-Bang-Befehl belegt ist))# ‐*‐ Codierung: Windows‐1252 ‐*‐
In Python verwendete Codierung
C:UsersJL>chcp #Finden Sie die vom Betriebssystem verwendete Codierung
Aktive Codepage: 936>>> import sys, locale
>>> locale.getpreferredencoding() #Dies ist das Wichtigste
'cp936'
>>> ; ('cafe.txt','r')
>>> type(my_file)
>>> Das Dateiobjekt verwendet standardmäßig den Wert von locale.getpreferreddecoding()
'cp936'
>>> sys.stdin.isatty(), sys.stderr () #Ob die Ausgabe die Konsolenkonsole ist
(True, True, True)
>>> sys.stdout.encoding, sys.stdin.encoding, sys.stderr.encoding #sys standard Wenn die Wenn der Kontrollfluss umgeleitet oder in eine Datei geleitet wird, verwendet die Kodierung den Wert der Umgebungsvariablen PYTHONIOENCODING, die Kodierung der Konsole oder die Kodierung von locale.getpreferredencoding(), wobei die Priorität in der Reihenfolge abnimmt.
('cp936', 'cp936', 'cp936')
>>> sys.getdefaultencoding() #Wenn Python Binärdaten in ein Zeichenobjekt konvertieren muss, verwenden Sie diesen Standardwert.
'utf-8'
>>> sys.getfilesystemencoding() #Wenn Python zum Kodieren oder Dekodieren von Dateinamen (nicht von Dateiinhalten) verwendet wird, wird diese Kodierung standardmäßig verwendet.
'mbcs'
Die oben genannten sind die Testergebnisse unter Windows. Wenn unter GNU/Linux oder OSX, dann sind alle Ergebnisse UTF-8.
Codierung zum Lesen und Schreiben von Dateien
>>> pen('cafe.txt','w',encoding='utf-8').write('café')
4>>> ('cafe.txt','r')
>>> fp.read()
'caf Mao'
>>>
>>> open('cafe.txt','r', binding = 'cp936').read()
'caf Mao'
>>> Cafe.txt','r', Encoding = 'latin1').read()
'café'
>>> fp = open('cafe.txt','r', Encoding = 'utf-8')
>>> fp.encoding
'utf-8'
Wie aus dem obigen Beispiel ersichtlich ist, sollten Sie zu keinem Zeitpunkt die Standardcodierung verwenden, da bei der Ausführung auf verschiedenen Computern unerwartete Probleme auftreten.
Wie Python mit Unicode-Problemen umgeht
Python vergleicht die Größe von Zeichenfolgen immer anhand von Codepunkten oder ob sie gleich sind.
Es gibt zwei Möglichkeiten, Akzentsymbole in Unicode darzustellen, dargestellt durch ein Byte oder dargestellt durch Basisbuchstaben plus Akzentsymbole. In Unicode sind sie gleich, in Python jedoch, da sie anhand der Codepunktgröße verglichen werden , also sind sie nicht gleich.
>>> c1 = 'cafeu0301'
>>> c2 = 'café'
>>> c1 == c2
>>> len(c1), len(c2)
(5, 4)
NFC (Normalization Form Canonical Composition): Zerlegen Sie es auf eine standardäquivalente Weise und setzen Sie es dann auf eine standardäquivalente Weise wieder zusammen. Wenn es sich um einen Singleton handelt, kann das Ergebnis der Reorganisation anders sein als vor der Zerlegung. Kürzen Sie die Länge der gesamten Zeichenfolge so weit wie möglich, sodass die 2 Bytes von „eu0301“ in ein Byte von „é“ komprimiert werden.
NFD (Normalization Form Canonical Decomposition): Zerlegen Sie auf eine standardmäßige äquivalente Weise.
NFKD (Normalization Form Compatibility Decomposition): Zerlegen Sie auf eine kompatible äquivalente Weise.
NFKC (Normalization Form Compatibility Composition): Zerlegen Sie auf eine konsistente äquivalente Weise Zerlegen Sie es auf eine kapazitätsäquivalente Weise und setzen Sie es dann auf eine standardmäßig äquivalente Weise wieder zusammen.
NFKC und NFKD können zu Datenverlust führen.
>>> c3 = normalize('NFC',c1) #Operation c1 in Richtung der Verkürzung der Stringlänge
>>> (c3)
4
>>> c3 == c2
True
>>> c4 = normalize('NFD',c2)
>> > len(c4)
5
>>> c4 == c1
True
Diese Funktion konvertiert ein einzelnes Unicode-Zeichen in ein anderes Unicode-Zeichen.
>>> o2 = 'u03a9'
>>> , 'Ω')
>>> o1 == o2
Falsch
>>> name(o1), name(o2)
('OHM SIGN', ' GRIECHISCHER GROSSBUCHSTABE OMEGA')
>>> o3 = normalize('NFC',o1)
>>> name(o3)
'GRIECHISCHER GROSSBUCHSTABE OMEGA'
>> ; u2 = 'u03bc'
>>> )
('MICRO SIGN', 'GRIECHISCHER KLEINBUCHSTABE MU')
>>> u3 = normalize('NFKD',u1)
>>> name(u3)
Ein weiteres Beispiel
>>> h1 = 'u00bd'
>>> h2 = normalize(' NFKC' ,h1)
>>> h1, h2
('½', '1⁄2')
>>> 🎜> (1, 3)
Manchmal möchten wir zum Vergleich eine Form ohne Berücksichtigung der Groß- und Kleinschreibung verwenden
In den meisten (98,9 %) Fällen str.casefold( ) Das Ergebnis stimmt mit str.lower() überein.
Textsortierung
Wenn Sie einfach der Python-Methode zum Vergleichen von Codepunkten folgen, werden aufgrund unterschiedlicher Sprachregeln viele Ergebnisse angezeigt, die nicht den Erwartungen der Benutzer entsprechen.
Normalerweise wird locale.strxfrm zum Sortieren verwendet.
>>> Gebietsschema importieren
>>> 🎜>>>> sort_result = sorted(intial, key = locale.strxfrm)
Kodierungs- und Dekodierungsfehler
Wenn im Python-Quellcode ein Dekodierungsfehler vorliegt , dann wird eine SyntaxError-Ausnahme generiert.
Mehrere nützliche Methoden aus Fluent Python
vom Unicode-Datenimport normalisieren, kombinieren
def nfc_equal(s1, s2):
'''gibt True zurück, wenn String s1 nach der Normalisierung unter "NFC" mit String s2 übereinstimmt '''
return normalize ("NFC",s1) == normalize("NFC",s2)
def Fold_equal(s1, s2):
'''return True, wenn String s1 nach der Normalisierung unter mit String s2 übereinstimmt "NFC" und casefold()'''
return normalize('NFC',s1).casefold() == normalize('NFC',s2).casefold()
def shave_marks(txt ):
'''Alle diakritischen Zeichen entfernen
im Grunde muss nur der lateinische Text in reines ASCII geändert werden, aber diese Funktion ändert auch griechische Buchstaben
unter der Funktion „shave_latin_marks“ ist die Genauigkeit präziser‘“
normal_txt = normalize('NFD',txt)
shaved = ''.join(c für c in normal_txt, wenn nicht binding(c))
return normalize('NFC',shaved)
def shave_latin_marks(txt):
'''Alle diakritischen Zeichen aus lateinischen Basiszeichen entfernen'''
normal_txt = normalize('NFD',txt)
keeping = []
latin_base =Falsch
für c in normal_txt:
bei Kombination von (c) und latin_base:
continue #Ingore diakritische Zeichen auf lateinischem Basiszeichen
keeping.append(c)
#If es verbindet sich nicht char, es sollte ein neues Basiszeichen sein
wenn nicht kombinierend (c):
latin_base = c in string.ascii_letters
编码探嗅Chardet
这是Python的标准模块.
参考资料:
http://blog.csdn.net/tcdddd/article/details/8191464
以上就是python与编码的内容,更多相关文章请关注PHP中文网(www.php.cn)!