Seite 1 von 1

Umlaute beim Auslesen von einer HTTP Seite

Verfasst: Sonntag 23. Juli 2006, 16:47
von aquila
Hallo,

ich habe vor kurzem einen Webshop bei mir installiert. Die Umlaute werden auch eigentlich korrekt angezeigt (siehe ephemeriden.com/shop/shop.cgi?Operation=ItemLookup&ItemId=B000G5SFLU). Da dieser Shop aber in mein bestehendes Template eingebaut werden soll, muss ich es via urllib.urlopen auslesen und dann in mein Template einfügen (siehe http://ephemeriden.com/shop.py?Operatio ... B000G5SFLU). Dabei gehen jedoch alle Umlaute kaputt. Gehe ich richtig in der Annahme, dass das shop.cgi utf-8 ausspuckt? Versuchte mir dann über .encode() zu helfen, was aber nicht funktioniert. Momentan sehen dann Zeichen, die ich nicht explizit mit einer Ersetzung durch .replace() korrigiere, so aus:
Groovecatcher - Café De La Plage
Wie man sieht ist das é fehlerhaft.


Grüße,
aquila

Verfasst: Sonntag 23. Juli 2006, 19:46
von BlackJack
Entweder benutzt Du auch UTF-8 für Deine Seite, oder Du musst das UTF-8 dekodieren und dann in der Kodierung wieder kodieren, die Du jetzt für Deinen Shop benutzt.

Verfasst: Sonntag 23. Juli 2006, 20:19
von aquila
Ich kriege das nicht gebacken, dieses utf-8 zu dekodieren, wahrscheinlich einfach aus mangelnder Erfahrung mit utf. Das Problem lässt hierauf reduzieren, nämlich z.B. den String "Café De La Plage" zu dekodieren. Ich habe einige Zeit in der interaktiven Umgebung verbracht, das Problem zu lösen. Eigentlich dachte ich, dass folgendes funktionieren müsste:

Code: Alles auswählen

>>> input = "Café De La Plage"
>>> utf = unicode(input, "utf-8")
>>> print utf
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "F:\Python22\lib\encodings\cp850.py", line 18, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u01f8' in position
 3: character maps to <undefined>
Der String ist definitiv utf-8. Er tut so als wäre meine Kodierung fehlerhaft. Irgendwelche Ideen?

Grüße,
aquila

Verfasst: Sonntag 23. Juli 2006, 21:01
von DatenMetzgerX
demfall ist es nicht utf-8

Verfasst: Sonntag 23. Juli 2006, 21:13
von BlackJack
Als erstes stellt sich die Frage ob `input` bei Dir wirklich UTF-8 kodiert ist. Das kann man bei Deinem Beispiel nicht sehen. Wenn ich das nämlich einfach so bei mir in die Python-Shell eintippe, dann ist sind die Zeichen 'Ã' und '©' bei der Eingabe als UTF-8 kodiert und nicht die UTF-8 Kodierung für ein 'é':

Code: Alles auswählen

In [16]: a = 'Café De La Plage'

In [17]: print repr(a)
'Caf\xc3\x83\xc2\xa9 De La Plage'

In [18]: b = a.decode('utf-8')

In [19]: print repr(b)
u'Caf\xc3\xa9 De La Plage'

In [20]: print b
Café De La Plage
Bei ``print`` muss aus der Unicode Zeichenkette wieder eine Byte-Zeichenkette gemacht werden, dazu wird geschaut welche Kodierung in `sys.stdout.encoding` steht. Bei mir ist das UTF-8, darum sieht auch die Ausgabe so aus.

Bei Deiner ersten Zuweisung kann es sich nicht im UTF-8 handeln weil bei Deinem ``print`` zwei Sachen deutlich werden: 1. wird versucht die Unicode Zeichenkette als cp850 zu kodieren, sieht also nach DOS/Eingabeaufforderung aus, und 2. enthält die Unicode Zeichenkette ein grosses N mit einem Accent Grave. Das Zeichen gibt's in der cp850 Kodierung nicht, darum kracht's.

Was ist passiert? Du hast eine cp850 kodierte Zeichenkette versucht als UTF-8 zu dekodieren. Meine Eingaben sind UTF-8 kodiert, darum kodiere ich das zum Testen erstmal in cp850 um:

Code: Alles auswählen

In [21]: c = 'Café De La Plage'.decode('utf-8').encode('cp850')

In [22]: c.decode('utf-8').encode('cp850')
---------------------------------------------------------------------------
exceptions.UnicodeEncodeError     Traceback (most recent call last)

/home/marc/<ipython console>

/usr/lib/python2.4/encodings/cp850.py in encode(self, input, errors)
     16     def encode(self,input,errors='strict'):
     17
---> 18         return codecs.charmap_encode(input,errors,encoding_map)
     19
     20     def decode(self,input,errors='strict'):

UnicodeEncodeError: 'charmap' codec can't encode character u'\u01f8' in position 3: character maps to <undefined>

In [23]: import unicodedata

In [24]: unicodedata.name(u'\u01f8')
Out[24]: 'LATIN CAPITAL LETTER N WITH GRAVE'

Verfasst: Montag 24. Juli 2006, 10:28
von aquila
Perfekt, danke BlackJack 8).

Code: Alles auswählen

content.decode('utf-8').encode('iso-8859-1')
Hat jetzt alle meine Probleme gelöst.

Grüße,
Christian

Re: Umlaute beim Auslesen von einer HTTP Seite

Verfasst: Montag 24. Juli 2006, 13:55
von jens
aquila hat geschrieben: muss ich es via urllib.urlopen auslesen und dann in mein Template einfügen
Schau mal in mein kleines IncludeRemote-Plugin für PyLucid:
https://opensvn.csie.org/traccgi/PyLuci ... eRemote.py
Zeile 71... (Ist zwar eine schnelle Variante um das charset festzustellen, aber es geht)

Verfasst: Montag 24. Juli 2006, 16:52
von aquila
Ja, ansich eine praktische Sache. Nur habe ich die zu inkludierende Seite schon so stark beschnitten, dass kein Head-Bereich und damit keine Meta-Tags mehr drin sind. An deiner Stelle würde ich vielleicht noch class="" Attribute rausfiltern.

Grüße