ubuntuusers.de

Python Unicode/UTF-8? Darstellung

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

ak01

Anmeldungsdatum:
15. Januar 2007

Beiträge: 89

Hallo!

Ich habe mir ein kleines Python Script geschrieben welches die geoip-Datenbank aus dem python-geoip Packet benutzt um IP-Adressen Orte zuzuweisen. Mein Problem ist nun das einige Orte wie z.B. Nürnberg als 'N\xfcrnberg' gespeicher sind und mittels print dann mit komischen Sonderzeichen ausgegeben werden: N�rnberg

Wenn ich nun direkt

print u'N\xfcrnberg'

angebe klappt die darstellung des ü ohne Probleme. Ich habe aber den String nun schon in einer Variable, wie kann ich diese Variable nun mit print in der richtigen Kodierung darstellen lassen?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Python 2.x nehme ich mal an?

1
print u"Hallöle".encode("dein konsolen encoding")

Generell die üblichen Empfehlungen zu dem Thema:

ak01

(Themenstarter)

Anmeldungsdatum:
15. Januar 2007

Beiträge: 89

Ah danke für die Links! Mit variable.decode('iso-8859-1') klappt die Ausgabe.

Zum Verständnis: dabei wird der unkodierte String 'N\xfcrnberg' nach Unicode umgewandelt, korrekt? Wieso kann nun Unicode dargestellt werden obwohl ich # -*- coding: utf-8 -*- eingestellt habe?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

ak01 schrieb:

Ah danke für die Links! Mit variable.decode('iso-8859-1') klappt die Ausgabe.

Das ist schon mal nicht das gewünschte 😉

Zum Verständnis: dabei wird der unkodierte String 'N\xfcrnberg' nach Unicode umgewandelt, korrekt? Wieso kann nun Unicode dargestellt werden obwohl ich # -*- coding: utf-8 -*- eingestellt habe?

Nee nee, Unicode wird niemals dargestellt! Dargestellt werden nur Encodings, wie eben iso-... oder utf-8 usw. Du musst die Links noch besser lesen. Su solltest darauf achten, möglichst früh im Code in Unicode zu wandeln; in Deinem Falle direkt bei / nach der Datenbankabfrage. Intern arbeitest Du dann nur mit Unicode und wandelst dann direkt vor der Ausgabe (egal ob Shell oder Datei o.ä.) wandelst Du explizit in das gewünschte Encoding.

Durch Deine coding-Angabe kapiert Python lediglich, dass alle String-Literale innerhalb Deines Quellcodes als utf-8 codiert dargestellt werden und kann diese dadurch korrekt interpretieren.

Dass Dein Code nun funzt liegt einfach daran, dass Python bei der Ausgabe eben in diese angegebene encoding wandelt; und da Deine Shell wohl utf-8 spricht passt das eben durch Zufall.

ak01

(Themenstarter)

Anmeldungsdatum:
15. Januar 2007

Beiträge: 89

Also um das richtig zu verstehen, Ich habe meine Variable v, type(v) gibt mir str aus, die Variable ist also kodiert. Nun enkodiere ich diese mittels v.encode('iso-8859-1'), ich hatte auch utf-8 probiert, da bekomm ich aber eine Fehlermeldung, folglich müsste die Variable also mit iso-8859-1 kodiert gewesen sein und ist nun nach Unicode dekodiert, richtig? Mein Programm kodiert nun den Unicode direkt bei Ausgabe in utf-8, wieso muss ich nicht extra vorher nochmal mit encode('utf-8') das erledigen?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

ak01 schrieb:

Also um das richtig zu verstehen, Ich habe meine Variable v, type(v) gibt mir str aus, die Variable ist also kodiert.

Richtig, man spricht auch von Byte-Strings. Im Gegensatz dazu gibt es noch Unicode-Strings, die eben uncodierte Zeichenketten darstellen; diese sind aber nur intern verwendbar und stellen für Dich letztlichz eine Blackbox dar. Sobald was in Dein Programm rein kommt oder raus geht, wird codiert. Daher immer versuchen das explizit zu machen und möglichst direkt beim Eingang in Unicode wandeln und beim Ausgang wieder explizit kodieren.

Nun enkodiere ich diese mittels v.encode('iso-8859-1')

Falsch! Man dekodiert diese per "".decode(encoding)

, ich hatte auch utf-8 probiert, da bekomm ich aber eine Fehlermeldung, folglich müsste die Variable also mit iso-8859-1 kodiert gewesen sein und ist nun nach Unicode dekodiert

Ja, wenn Du dekodierst hast, dann ok. (Nur der Vollständigkeit: Es gibt zig Encodings. Nur weils utf-8 nicht ist, muss es in de Praxis kein iso-8859-1 sein 😉 )

Mein Programm kodiert nun den Unicode direkt bei Ausgabe in utf-8, wieso muss ich nicht extra vorher nochmal mit encode('utf-8') das erledigen?

Lies mal hier: http://www.python.org/dev/peps/pep-0263/ und dort der Abschnitt "Defining the Encoding". Prinzipiell geht das, weil Du in Deinem Script ja utf-8 als Standard angegeben hast. Nimm das mal weg, dann krachts, weil Python dann ASCII annimmt und Umlaute nicht kodieren kann (das implizite encoding() beim print wird eben fehlschlagen)

ak01

(Themenstarter)

Anmeldungsdatum:
15. Januar 2007

Beiträge: 89

Ja genau, hatte mich mit dem encode nur vertippt. Danke für die Infos, jetzt ist mir einiges klarer!

Antworten |