Die Hauptquelle der Probleme, die ich mit Unicode-Strings arbeiten hätte ist, wenn Sie utf-8 kodierten Strings mischen mit Unicode-Einsen.
Betrachten Sie zum Beispiel die folgenden Skripts.
two.py
# encoding: utf-8
name = 'helló wörld from two'
one.py
# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name
Der Ausgang python one.py
des Laufens ist:
Traceback (most recent call last):
File "one.py", line 5, in <module>
print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
In diesem Beispiel two.name
ist ein UTF-8-codierter String (nicht Unicode), da unicode_literals
undnicht importiert wurdenist eine Unicode-Zeichenfolge. Wenn Sie beide mischen, versucht Python, die kodierte Zeichenkette zu dekodieren (vorausgesetzt, es ist ascii) und konvertiert sie in Unicode und schlägt fehl. Es würde funktionieren, wenn Sie print name + two.name.decode('utf-8')
taten.
Das Gleiche kann passieren, wenn Sie eine Zeichenfolge codieren und versuchen, sie später zu mischen. Zum Beispiel funktioniert das:
# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Ausgang:
DEBUG: <html><body>helló wörld</body></html>
aber nach dem import unicode_literals
Hinzufügen es nicht:
# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Ausgang:
Traceback (most recent call last):
File "test.py", line 6, in <module>
print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)
Es schlägt fehl, weil 'DEBUG: %s'
eine Unicode-Zeichenfolge ist und daher versucht Python, html
zu decodieren. Ein paar Möglichkeiten, um den Druck zu beheben, sind entweder print str('DEBUG: %s') % html
oder print 'DEBUG: %s' % html.decode('utf-8')
.
Ich hoffe, dies hilft Ihnen, die potenziellen Fehler zu verstehen, wenn Sie Unicode-Strings verwenden.
Ich würde vorschlagen, mit den 'decode()' Lösungen statt der 'str()' oder 'encode()' Lösungen zu gehen: Je öfter Sie Unicode-Objekte verwenden, desto klarer ist der Code, da was Sie wollen ist manipulieren Zeichenketten, nicht Arrays von Bytes mit einer extern implizierten Codierung. – EOL
Bitte korrigieren Sie Ihre Terminologie.'Wenn Sie utf-8-kodierte Strings mit Unicode-Einsen mischen, gibt es in UTF-8 und Unicode nicht zwei verschiedene Kodierungen; Unicode ist ein Standard und UTF-8 ist eine der Codierungen, die es definiert. – Kos
@Kos: Ich denke, er meint "mix" utf-8 codierte Strings "* Objekte * mit Unicode (also dekodierten) * Objekten *. Ersteres ist vom Typ "str", letzteres ist vom Typ "Unicode". Da es sich um verschiedene Objekte handelt, kann es zu Problemen kommen, wenn Sie versuchen, sie zu summieren/zu verketten/zu interpolieren. – MestreLion