Heim > Backend-Entwicklung > Python-Tutorial > Python und Codierung

Python und Codierung

黄舟
Freigeben: 2016-12-16 11:34:24
Original
1249 Leute haben es durchsucht

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'"

Unicode- und Zeichenkonvertierung

Verwenden Sie chr, um einen Unicode-Codepunkt in Zeichen umzuwandeln, und verwenden Sie ord, um den umgekehrten Vorgang auszuführen.

>>> ord('A')

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.

Über mbcs und utf -8 Unterschiede finden Sie unter http://stackoverflow.com/questions/3298569/difference-between-mbcs-and-utf-8-on-windows


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)

Die Lösung besteht darin, die Normalisierungsfunktion in der Unicodedata-Bibliothek zu übergeben, die erste von diese Funktion Der Parameter kann einen der vier Parameter „NFC“, „NFD“, „NFKC“, „NFKD“ akzeptieren.

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.

from unicodedata import normalize

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

Westliche Tastaturen geben normalerweise die kürzestmögliche Zeichenfolge ein Das Ergebnis stimmt mit „NFC“ überein, aber es ist sicherer, es über „NFC“ zu betreiben und dann zu vergleichen, ob die Zeichenfolgen gleich sind. Und W3C empfiehlt die Verwendung von „NFC“-Ergebnissen.

Das gleiche Zeichen hat in Unicode zwei verschiedene Kodierungen.

Diese Funktion konvertiert ein einzelnes Unicode-Zeichen in ein anderes Unicode-Zeichen.

>>> o1 = 'u2126'

>>> 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)

'GRIECHISCHER KLEINBUCHSTABE MU'

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

Verwenden Sie die Methode str.casefold(), die zum Vergleich Großbuchstaben in Kleinbuchstaben umwandelt Beispiel: „A“ wird in „a“ umgewandelt und „µ“ von „MICRO SIGN“ wird in „µ“ von „GRIECHISCHER KLEINBUCHSTABE MU“ umgewandelt.

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.

In anderen Fällen werden, wenn Codierungs- und Decodierungsfehler gefunden werden, die Ausnahmen UnicodeEncodeError und UnicodeDecodeError 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)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage