Umlaute beim Auslesen von einer HTTP Seite

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
aquila
User
Beiträge: 13
Registriert: Mittwoch 22. März 2006, 01:40
Kontaktdaten:

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
[url=http://ephemeriden.com]Onlineplanetarium[/url] - [url=http://www.astrofind.net/]AstroFind - Astronomical Search Engine[/url] - [url=http://www.astrofind.net/discussion/]Astronomy Discussion[/url]
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.
aquila
User
Beiträge: 13
Registriert: Mittwoch 22. März 2006, 01:40
Kontaktdaten:

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
[url=http://ephemeriden.com]Onlineplanetarium[/url] - [url=http://www.astrofind.net/]AstroFind - Astronomical Search Engine[/url] - [url=http://www.astrofind.net/discussion/]Astronomy Discussion[/url]
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

demfall ist es nicht utf-8
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'
aquila
User
Beiträge: 13
Registriert: Mittwoch 22. März 2006, 01:40
Kontaktdaten:

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
[url=http://ephemeriden.com]Onlineplanetarium[/url] - [url=http://www.astrofind.net/]AstroFind - Astronomical Search Engine[/url] - [url=http://www.astrofind.net/discussion/]Astronomy Discussion[/url]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
aquila
User
Beiträge: 13
Registriert: Mittwoch 22. März 2006, 01:40
Kontaktdaten:

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
[url=http://ephemeriden.com]Onlineplanetarium[/url] - [url=http://www.astrofind.net/]AstroFind - Astronomical Search Engine[/url] - [url=http://www.astrofind.net/discussion/]Astronomy Discussion[/url]
Antworten