Seite 1 von 1

Umlaute

Verfasst: Montag 25. Februar 2008, 14:18
von Tartaruga
Liebes Python Forum.

Ich habe im Forum schon gesucht aber leider nichts gefunden. Ich hab folgendes Problem.
Eine Funktion ließt einen String aus. So weit so gut nur wenn der String einen Umlaut beinhaltet, dann bekomme ich folgende Fehlermeldung wenn ich den string wieder ausgebe:
UnicodeEncodeError 'ascii' codec can't encode character u'xe4' in position 40 ordinal not in range(128)

Dadurch ist mir auch nicht Möglich den Umlaut zu ersetzen weil auch da das Programm abstürtzen würde. Vielleicht kann mir jemand helfen.

Danke
Tartaruga

Code: Alles auswählen

def Fehler_lesen(ERROR):
    if ERROR.Execute()== 0:
        return 'ERROR_1'#auslesen des speichers nicht moeglich
    else:
        errorvalue = ERROR.GetNumberOfErrorDatas()
        errorData = ERROR.GetErrorData(1).GetText()
        errorData.replace(u'ä', 'ae')
        return errorData

Re: Umlaute

Verfasst: Montag 25. Februar 2008, 14:29
von Hyperion
Tartaruga hat geschrieben: Eine Funktion ließt einen String aus.
Wieso zeigst Du die uns nicht?
UnicodeEncodeError 'ascii' codec can't encode character u'xe4' in position 40 ordinal not in range(128)
Naja, ASCII kennt eben keine Umlaute. Du musst schon ein encoding wählen, welches so etwas darstellen kann, also etwa utf-8 oder iso-8859-1 o.ä.

Code: Alles auswählen

s = u"Hallöle"
print s.encode("utf-8")
Dadurch ist mir auch nicht Möglich den Umlaut zu ersetzen weil auch da das Programm abstürtzen würde. Vielleicht kann mir jemand helfen.
Wieso? Was hat das Ändern mit der Ausgabe zu tun? Bezieht sich das auf den Code, den Du gegeben hast?

Verfasst: Montag 25. Februar 2008, 14:48
von Tartaruga

Code: Alles auswählen

errorData = ERROR.GetErrorData(1).GetText() 
gibt einen String zurück.


Code: Alles auswählen

return errorData.encode("utf-8")
hat funktioniert. nur leider schreibt er jetzt ein großes Ä anstatt einem kleinen.

ich wollte mit:

Code: Alles auswählen

errorData.replace(u'ä', 'ae')
den Umlaut ersetzten aber das hat nicht so ganz funktioniert gibt es da vielleicht schon was fertiges.
Was das ändern mit der Ausgabe zu tun hat weiß ich auch nicht. Ich beziehe mich schon auf den Code den ich voher gepostet habe.

Verfasst: Montag 25. Februar 2008, 14:54
von Frank aka Ch3ck3r

Code: Alles auswählen

import sys
sysencoding = sys.stdout.encoding or sys.getfilesystemencoding() 

#------------------------------
return errorData.encode(sysencoding)
probier es mal so

Verfasst: Montag 25. Februar 2008, 15:28
von Tartaruga
Frank aka Ch3ck3r hat geschrieben:

Code: Alles auswählen

import sys
sysencoding = sys.stdout.encoding or sys.getfilesystemencoding() 

#------------------------------
return errorData.encode(sysencoding)
so hats leider nicht funktioniert. Aber wenn ich

Code: Alles auswählen

errorData.encode("iso-8859-1")
schreibe dann funktionierts.
Jetzt hab ich aber noch eine Frage:
Funktioniert das .encode("iso-8859-1") nicht mit einer Liste???

Danke
Lg

Verfasst: Montag 25. Februar 2008, 15:48
von BlackJack
`errorData` ist nach allem was Du hier gezeigt hast *keine* Zeichenkette, sondern ein Unicode-Objekt!

Man kann Unicode nicht ausgeben, sondern nur Bytes. Also muss man aus dem Unicode-Objekt eine Zeichenkette (also eigentlich Bytekette) machen. Und zwar in einer Kodierung, die der Empfänger der Bytes erwartet. Wenn man das nicht explizit macht, dann verwendet Python die ASCII-Codierung, d.h. alles ausserhalb von ASCII führt zu einem `UnicodeEncodeError`.