Frage

Ich habe einige Skript in Python, dass eine Verbindung herstellt zu GMAIL und eine E-Mail Text drucken ... Aber oft meine E-Mails hat Worte mit „Akzent“. Und es ist mein Problem ...

Zum Beispiel ein Text, den ich habe. "PLANO DE S = C3 = 9ADE" als "PLANO DE SAÚDE" gedruckt werden

Wie kann ich lesbar drehe meinen E-Mail-Text? Was kann ich Thesen Buchstaben mit Akzent konvertieren verwenden?

Danke,


Der Code von Andrey vorgeschlagen, funktioniert auf Windows, aber auf Linux ich immer noch den falschen Druck bekommen:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÃDE

Rafael,

Danke, Sie über das Wort korrekt sind, war es falsch geschrieben. Aber das Problem immer noch das gleiche hier. Ein anderes Beispiel: Richtiges Wort: obersevação

>>> b = 'Observa=C3=A7=C3=B5es'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
Observações

Ich verwende Debian mit UTF-8 locale:

>>> :~$ locale
LANG=en_US.UTF-8

Andrey,

Vielen Dank für Ihre Zeit. Ich stimme mit Ihrer Erklärung, aber immer noch mit dem gleichen Problem. Nimmt Blick in meinem Test:

   s='Observa=C3=A7=C3=B5es'
   s2= s.decode('quopri').decode('utf-8')

   >>> print s

   Observa=C3=A7=C3=B5es

   >>> print s2

   Observações

   >>> import locale

   >>> ENCODING = locale.getpreferredencoding()

   >>> print s.encode(ENCODING)
   Observa=C3=A7=C3=B5es

   >>> print s2.encode(ENCODING)
   Observações

   >>> print ENCODING
   UTF-8
War es hilfreich?

Lösung

Diese Codierung heißt Quoted-printable. In Ihrem Beispiel haben Sie eine Zeichenfolge (Python unicode) codiert in UTF-8-Byte (Python str) in quoted-printable Bytes codiert. Also der richtige Weg, einen String-Wert zu erhalten, ist:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE

Update: Es könnte einige Probleme sein mit der Konsole obwohl conding. s hält einen vollständig korrekten Wert Unicode-Zeichenfolge (Python Typ unicode). Aber wenn Sie die print-Anweisung verwenden, um den Wert muss zu Bytes umgewandelt werden (Python str), um OS Dateideskriptors Nummer 1 geschrieben zu werden (die Standardausgabe Rohr). So die print Anweisung Implementierung prüft Ihre Konsole Codierung, macht dann einige Vermutungen und druckt die Ergebnisse. In der Tat wird in Python 2 sind die Ergebnisse für die von der interaktiven Shell Druck unterschiedlich sein, Ihren Prozess nicht interaktiv ausgeführt wird und Ihr Prozess läuft, während die Ausgabe in eine Datei umgeleitet werden.

Der beste Weg zur Ausgabe kodierten Strings in Python 2 ist nicht vereinbart. Zwei Wege, die am meisten Sinn machen, sind:

1) Die Verwendung locale der Codierung erraten und manuell kodieren Strings.

import locale
ENCODING = locale.getpreferredencoding()

print s.encode(ENCODING)

2) Verwenden einer Verschlüsselungsoption (Befehlszeile, hartcodiert oder was auch immer).

from getopt import getopt
ENCODING = 'UTF-8'
opts, args = getopt(sys.argv[1:], '', ['encoding='])
for opt, arg in opts:
    if opt == '--encoding':
        ENCODING = arg

print s.encode(ENCODING)

Update 2: Wenn alles nichts hilft und Sie immer noch sicher, dass Ihre Konsole Codierung und Schrift werden auf UTF-8, dann versuchen Sie dies:

import sys, os
ENCODING = 'UTF-8'
stdout = os.fdopen(sys.stdout.fileno(), 'wb')
s = u'привет' # Don't forget to use a Unicode literal staring with u''
stdout.write(s.encode(ENCODING))

An diesem Punkt Sie muss sehen das russische Wort привет in kyrillischen Zeichensatz in der Konsole:)

Wenn dies der Fall ist, dann sollten Sie diese binäre stdout anstelle von normalen sys.stdout.

Andere Tipps

Ihre Zeichenfolge falsch ist, aussehen:

'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'

Wo ist die fehlende "A" in SAÚDE?

Wenn Sie 'PLANO DE S=C3=9ADE' als quoted-printable dekodieren, erhalten Sie nur ‚PLANO DE Sude‘.

Ausführen diesen Code hier auf Linux (Ubuntu 9.10):

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top