Wie behandle ich eine ASCII-Zeichenfolge als Unicode und unescape die Escape-Zeichen in es in Python?

StackOverflow https://stackoverflow.com/questions/267436

  •  06-07-2019
  •  | 
  •  

Frage

Zum Beispiel, wenn ich einen Unicode string, ich es als kodieren, kann ASCII string wie folgt:

>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'

Allerdings habe ich zum Beispiel Diese ASCII string:

'\u003foo\u003e'

..., dass ich in das gleiche machen wollen ASCII string wie in meinem ersten Beispiel oben:

'<foo/>'
War es hilfreich?

Lösung

Es dauerte eine Weile, um dieses ein, um herauszufinden, aber dieser Seite hatte die beste Antwort:

>>> s = '\u003cfoo/\u003e'
>>> s.decode( 'unicode-escape' )
u'<foo/>'
>>> s.decode( 'unicode-escape' ).encode( 'ascii' )
'<foo/>'

Es gibt auch einen ‚raw-Unicode-Escape‘ Codec in die andere Richtung zu verarbeiten Unicode-Strings angeben - überprüfen Sie die „Unicode Constructors“ -Abschnitt der gelinkten Seite für weitere Einzelheiten (da bin ich nicht, dass Unicode-saavy) .

EDIT: Siehe auch Python Standard-Codierungen .

Andere Tipps

Ned Batchelder sagte:

  

Es ist ein wenig gefährlich, je nachdem, wo die Zeichenfolge herkommt,   aber wie:

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'

Eigentlich kann dieses Verfahren sicher gemacht werden wie folgt:

>>> s = '\u003cfoo\u003e'
>>> s_unescaped = eval('u"""'+s.replace('"', r'\"')+'-"""')[:-1]
Kümmern

den Triple-quote-String und den Bindestrich direkt vor dem Schluss 3-Anführungszeichen.

  1. eine 3-Zeichenfolge in Anführungszeichen verwenden wird sichergestellt, dass, wenn der Benutzer eingibt ‚\\“‘(Leerzeichen für visuelle Klarheit hinzugefügt) in der Zeichenfolge wäre es nicht den Auswerter stören;
  2. Der Strich am Ende ist eine ausfallsichere, falls die Zeichenfolge des Benutzers mit einem ‚\“‘enden Bevor wir das Ergebnis, das wir schneiden den eingefügten Strich mit zuweisen. [: 1]

So gäbe es keine Notwendigkeit, sich Sorgen zu machen, was die Benutzer eingeben, solange es im RAW-Format aufgenommen wird.

Auf Python 2.5 die richtige Codierung ist "unicode_escape", nicht "Unicode-Escape" (man beachte den Unterstrich).

Ich bin mir nicht sicher, ob die neuere Version von Python des Unicode-Namen geändert, aber hier nur mit dem Unterstrich gearbeitet.

Wie auch immer, das ist es.

An einem gewissen Punkt, den Sie auf Probleme stoßen, wenn Sie wie chinesische Schriftzeichen oder Emoticons in einem String Sie Sonderzeichen Begegnung heißt Fehler dekodieren, die wie folgt aussehen:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128)

Für meinen Fall (twitter Datenverarbeitung), I wie folgt decodiert mir zu erlauben, um alle Zeichen zu sehen, ohne Fehler

>>> s = '\u003cfoo\u003e'
>>> s.decode( 'unicode-escape' ).encode( 'utf-8' )
>>> <foo>

Es ist ein wenig gefährlich, je nachdem, wo die Zeichenfolge herkommt, aber wie etwa:

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top