2016-04-12 2 views
1

Ich habe ein Problem mit der Codierung mit Zeichenfolgen, die ich von einer externen Quelle bekomme. Diese Quelle sendet die codierten Zeichenfolgen an mich und ich kann sie nur decodieren, wenn sie Teil des Skriptcodes sind. Ich habe mir hier mehrere Threads angeschaut und sogar einige empfohlene Tutorials (zB this eins) aber leer ausgegangen.Python-Codierung Problem im Skript, wenn Zeichenfolge nicht fest codiert

Zum Beispiel, wenn ich dies auszuführen:

python -c 'print "gro\303\237e"' 

ich:

große 

Welches ist das richtige Ergebnis.

Aber wenn ich es in einem Skript verwenden, wie zum Beispiel:

import sys 
print sys.argv[1] 

und nennen Sie es wie test.py "gro\303\237e", erhalte ich:

gro\303\237e 

Ich beabsichtige, die richtige Zeichenfolge zu schreiben an syslog, aber Ich kann das nicht zur Arbeit bringen.

Einige Daten auf meinem System: - Python 2.7.10 - CentOS Linux - LANG = en_US.UTF-8 - LC_CTYPE = UTF-8

ich Hilfe zu schätzen wissen, lassen Sie mich bitte wissen wenn Sie mehr Informationen benötigen. Danke!

+2

Rufen Sie einfach Ihr Skript mit 'test.py" große "'. – syntonym

+0

Ich würde, aber ich kontrolliere nicht die Eingabezeichenfolge. Es kommt bereits verschlüsselt an. Vielen Dank. – n3g4s

+0

'\ xxx' in einem * String-Literal * wird als Escape-Sequenz interpretiert, aber ** nur ** in einem String-Literal. - Mehr als das ist jedoch "303 \ 237" als Escape-Sequenz für "ß" eher ... ungewöhnlich. Es scheint, als wäre die Kodierung dieser Zeichenfolge falsch gelaufen. Sie können das richtige Ergebnis erhalten, wenn Sie es (in) auf die gleiche Weise korrekt dekodieren, aber welche Art von Flucht ist das, und können Sie es an der Quelle korrigieren? – deceze

Antwort

0

Wenn Sie wirklich die Zeichen gro\303\237e haben, die etwas anderes als "gro\303\237e" ist (die erste sind die Zeichen gro \ 3 0 3 \ 2 3 7 ist die zweite die Zeichen gro ß e) Sie decode("escape_string") wie beschrieben verwenden können in this SO answer

Beachten Sie, dass dies wahrscheinlich ein Kodierungsfehler ist, wer auch immer die Daten produziert. Es kann also andere Fehler enthalten, die Sie mit dieser Methode nicht beheben können.

+0

Danke dafür, @syntonym. Dies half sehr und erwies sich als die einzige Antwort, die funktionierte. Danke auch an alle anderen, die sich gemeldet haben. Dein Beitrag war wichtig! – n3g4s

0

wird diese Arbeit:

import sys 
import ast 
print ast.literal_eval('b"%s"' % sys.argv[1]).decode("utf-8") 

Aber bitte über literal_eval zuerst sicherstellen, dass es Ihren Bedürfnissen entspricht (Ich denke, es sollte sicher sein zu verwenden, aber Sie sollten lesen und stellen Sie sicher) lesen.

+0

danke für den Tipp, aber ich bekomme einen anderen Fehler mit diesem Code: UnicodeEncodeError: 'Ascii' Codec kann nicht codieren Zeichen u '\ xdf' in Position 3: Ordnungszahl nicht im Bereich (128) – n3g4s

+0

das ist seltsam, habe ich versucht ' Python test.py "gro \ 303 \ 237e" 'und es funktioniert auf Windows und Linux (Ubuntu) mit Python 2.7.6. Was ist die genaue Eingabe, die nicht für Sie funktioniert? –

+0

Das ist die Eingabe: "gro \ 303 \ 237e" – n3g4s