alpha hat geschrieben:ich bekomme in folgender Zeile:
Code: Alles auswählen
wert = str(MyWorkSheet.Cells(1,spalte)).encode("utf-8")
diesen Fehler:
Traceback (most recent call last):
File "N:\scripts\Python\excellesen.py", line 32, in <module>
wert = str(MyWorkSheet.Cells(1,spalte)).encode("utf-8")
File "C:\programme\Python25\Lib\site-packages\win32com\client\dynamic.py", lin
e 187, in __str__
return str(self.__call__())
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 18:
ordinal not in range(128)
Hi alpha!
Um einen Text in eine besondere Codierung (z.B. utf-8) umzuwandeln, musst du zuerst herausfinden, in welcher Codierung der Quelltext vorhanden ist, oder ob dieser evt. bereits in Unicode vorliegt.
Ob Unicode oder nicht, sagt dir ``type``:
Wenn der Text im Unicode vorliegt, dann kannst du mit ``encode("utf-8")`` nach UTF-8 umwandeln.
Liegt der Text aber nicht im Unicode vor, musst du herausfinden, in welchem Coding dein Text vorliegt.
Unter einem deutschsprachigen Windows gibt es nicht viele mögliche Encodings. cp1252, iso-8859-1, iso-8859-15, mbcs und cp850. Die Reihenfolge entspricht in etwa der Wahrscheinlichkeit, da ein Encoding nicht sicher festgestellt, sondern nur nach Wahrscheinlichkeit erraten werden kann.
Am besten, du nimmst dir dafür eine Python-Shell zur Hand, die mit Umlauten umgehen kann. Ich verwende dafür gerne die PyShell, die beim wxPython-Demo mit dabei ist. Du kannst aber auch Idle verwenden.
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 18:
ordinal not in range(128)
Dann lass uns mal herausfinden, mit welchem Buchstaben es ein Problem gibt.
In Idle::
Es handelt sich also um das kleine "ö".
Ich setzte das mal ein bischen fort:
Code: Alles auswählen
>>> u"ö"
u'\xf6'
>>> u"ö".encode("cp1252")
'\xf6'
>>> u"ö".encode("utf-8")
'\xc3\xb6'
>>>
Der wahrscheinlichste Fall ist, vorausgesetzt, dass der Typ den du beim Prüfen mit ``type`` zurück bekommst nicht ``<type 'unicode'>`` ist, dass dein Text im Coding "cp1252" an Python übergeben wurde. Vielleicht auch in einem der anderen Encodings. Das musst du dann ausprobieren.
Die Umwandlung passiert, wie in
http://www.python-forum.de/topic-5095.html aufgezeigt, über Unicode.
Code: Alles auswählen
text_cp1252 = MyWorkSheet.Cells(1,spalte)
text_unicode = text_cp1252.decode("cp1252")
text_utf8 = text_unicode.encode("utf-8")
# oder kurz
text_utf8 = MyWorkSheet.Cells(1,spalte).decode("cp1252").encode("utf-8")
mfg
Gerold
:-)