Seite 1 von 1

Verfasst: Montag 19. März 2007, 17:52
von sauerkraut
Bei kommt wenn ich das Beispiel ausprobiere immer ein Fehler:

Code: Alles auswählen

#!/usr/bin/env python 
# -*- coding: iso-8859-1 -*- 

# Text definieren 
s_iso88591 = "Hallo Österreich" 

# Text nach Unicode umwandeln 
s_unicode = s_iso88591.decode("iso-8859-1") 

# Text nach UTF-8 umwandeln 
s_utf8 = s_unicode.encode("utf-8") 

print type(s_iso88591) 
print type(s_unicode) 
print type(s_utf8) 

try: 
    print s_iso88591 
except: 
    print "Nicht darstellbar..." 

try: 
    print s_unicode 
except: 
    print "Nicht darstellbar..." 

try: 
    print s_utf8 
except: 
    print "Nicht darstellbar..."
Fehlermeldung:

Traceback (most recent call last):
File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
exec codeObject in __main__.__dict__
File "C:\Documents and Settings\FLORREI\Desktop\test.py", line 8, in ?
In dieser Version braucht man sich zwar nicht um die Zeilenendzeichen
AttributeError: decode

Verfasst: Montag 19. März 2007, 19:30
von EnTeQuAk
Komisch... welche Pythonversion benutzt du?


Bei mir gehts:

Code: Alles auswählen

In [1]: text = "Hallo Österreich"

In [2]: unicode_text = text.decode("iso-8859-1")

In [3]: unicode_text
Out[3]: u'Hallo \xc3\x96sterreich'

In [4]: text
Out[4]: 'Hallo \xc3\x96sterreich'
MfG EnTeQuAk

Verfasst: Dienstag 20. März 2007, 10:05
von jens
sauerkraut hat geschrieben: In dieser Version braucht man sich zwar nicht um die Zeilenendzeichen
Wo kommt denn diese Zeile im Traceback her???

Kann es sein, das die Datei nicht in iso-8859-1 abgespeichert ist?

Verfasst: Dienstag 20. März 2007, 13:22
von sauerkraut
Wie schaffe ich es eine Datei explizi in iso-8859 abzuspeichern. Der Editor unter Windows verfügt nur über Unicode, UTF-8 und Ansi.

Ich verwende den PythonWin als Editor und Python 2.1 als Compiler (Windows XP)

Verfasst: Dienstag 20. März 2007, 13:36
von jens
Dann nimm einfach UTF-8 und ersetzte im Skript alle "iso-8859-1" Angaben durch "utf-8" ;)

EDIT: Andere Möglichkeit, verwende nur ASCII in deinen Skripten... Ein Ö kann man auch als "\u00D6" schreiben. Also so:

Code: Alles auswählen

text = u"Hallo \u00D6sterreich"
print repr(text)
print text.encode("iso-8859-1")
print text.encode("utf-8")
Mit http://pylucid.org/index.py/_command/14 ... display/1/ kann man diese Unicode Werte nachschauen...

Verfasst: Dienstag 20. März 2007, 14:52
von gerold
sauerkraut hat geschrieben:Wie schaffe ich es eine Datei explizi in iso-8859 abzuspeichern.
Hi sauerkraut!

Wähle "ansi" zum Speichern im Notepad (=Editor). Das entspricht ziemlich genau iso-8859-1.

mfg
Gerold
:-)

Verfasst: Dienstag 20. März 2007, 14:53
von jens
gerold hat geschrieben:Wähle "ansi" zum Speichern im Notebook (=Editor). Das entspricht ziemlich genau iso-8859-1.
Aber wie sollen damm Umlaute gespeichert werden??? Die sind doch nicht in ANSI enthalten...

Verfasst: Dienstag 20. März 2007, 14:58
von gerold
jens hat geschrieben:Dann nimm einfach UTF-8 und ersetzte im Skript alle "iso-8859-1" Angaben durch "utf-8" ;)
Hi Jens!

Das kannst du unter Windows vergessen. Kaum ein Editor unter Windows kann mit UTF-8 umgehen. Nicht einmal mein Lieblingseditor ConTEXT. Derzeit bist du unter Windows immer noch am Besten dran, wenn du als Encoding "iso-8859-1" verwendest. Schon bei "iso-8859-15" gibt es teilweise Probleme. (Außer du weißt was du tust und verwendest einen Editor, der mit anderen Encodings klar kommt.)

Mein Vorschlag für Anfänger ist also immer noch, im Header jeder Python-Datei als Coding "iso-8859-1" einzutragen und die Dateien ganz normal (ohne irgend eine Angabe des Encodings oder im Notepad ANSI verwenden) abzuspeichern. Windows kommt damit gut klar und Linux sowiso.

mfg
Gerold
:-)

Verfasst: Dienstag 20. März 2007, 15:04
von gerold
jens hat geschrieben:Aber wie sollen damm Umlaute gespeichert werden??? Die sind doch nicht in ANSI enthalten...
Hi Jens!

Es funktioniert aber. ;-)

- Unicode entspricht im Windows-Notepad UTF-16
- UTF-8 ist UTF-8
- Ansi entspricht im Windows-Notepad cp1252 was ungefähr iso-8859-1 entspricht.

lg
Gerold
:-)

Verfasst: Dienstag 20. März 2007, 15:05
von sauerkraut
Mein eigentliches Problem ist einfach, dass ich mit einem PYthon Skript aus einer dbf (dbase) Datei lese. Beim Befehl

Code: Alles auswählen

str(row.GetValue(fieldList[x]))
bekomme ich dann halt die Fehlermeldung:

UnicodeError: ASCII encoding error: ordinal not in range(128)

Was daran liegt, dass Sonderzeichen in er Datenbank vorkommen. Wie kann ich das ganze einfach und geshickt umgehen. Mit den Encode Befehle komme ich gerade nicht weiter.

Verfasst: Dienstag 20. März 2007, 15:18
von gerold
sauerkraut hat geschrieben:

Code: Alles auswählen

str(row.GetValue(fieldList[x]))
Mach mal ein

Code: Alles auswählen

repr(row.GetValue(fieldList[x]))
draus und zeige uns was dabei raus kommt. Wahrscheinlich ein in iso-8859-1 codierter String. Aber das sehen wir gleich.

Code: Alles auswählen

type(row.GetValue(fieldList[x]))
ist auch noch interessant.

mfg
Gerold
:-)

Verfasst: Dienstag 20. März 2007, 15:40
von sauerkraut
Richtig... zumindest schmeißt er mir keinen Fehler mehr aus. Allerdings erhalte ich jetzt den ISO Code dafür... kann ich das jetzt wieder umwandeln, ohne das er mir wieder eine exception auswirft?

Verfasst: Dienstag 20. März 2007, 17:05
von BlackJack
Du solltest uns eigentlich mal zeigen was die beiden ``print``-Befehle ausgeben wenn ein Zeichen ausserhalb von ASCII in den Daten enthalten ist.

Welchen Typ bekommst Du denn zum Beispiel? `str` oder `unicode`? Davon ausgehend müsste man dann weitersehen was zu tun ist.

Verfasst: Dienstag 20. März 2007, 19:11
von sauerkraut
Also:

Code: Alles auswählen

 Original  : 'LORENZ-B\xd6HLER-UKH-NOTAUFNAHME'
ISO 8859-1:  'LORENZ-B\xd6HLER-UKH-NOTAUFNAHME'
Original  : <type 'string'>
ISO 8859-1: 
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Python21\testDecoding.py", line 7, in ?
    print "ISO 8859-1: ",strText.encode("iso-8859-1")
AttributeError: encode
Jetzt bekomme ich allerdings das Zeichen \xd6 nicht aufgelöst, was eigentlich ein "ö" sein sollte.

Hab einen kleinen Beispielcode geschrieben, damit ich nicht das ganze Skript posten muss:

Code: Alles auswählen

text = "LORENZ-B\xd6HLER-UKH-NOTAUFNAHME"
strText = repr(text)
print "Original  :",str(strText)
print "ISO 8859-1: ",strText.encode("iso-8859-1")
strText = type(text)
print "Original  :",strText
print "ISO 8859-1: ",strText.encode("iso-8859-1")

Verfasst: Dienstag 20. März 2007, 19:22
von gerold
sauerkraut hat geschrieben:Hab einen kleinen Beispielcode geschrieben, damit ich nicht das ganze Skript posten muss:
Hallo sauerkraut!

Dein Beispielskript bringt dir nichts. Dein ganzes Skript posten bringt auch nichts. Es ist wichtig, zu wissen, was genau an der Stelle im Code von der Datenbank ausgelesen wird, an der es vorher gecrashed ist.

Damit es nicht chrashed und wir das Ergebnis sehen: schreib eine Zeile vor der Stelle an der es den Fehler gab:

Code: Alles auswählen

print repr(row.GetValue(fieldList[x]))
print type(row.GetValue(fieldList[x]))
und zeige uns, was von diesen beiden Codezeilen zurück kommt. Damit sehen wir, welcher Typ (Unicode oder str) von der Datenbankschnittstelle zurückgegeben wird und die Stringrepräsentation des Binärstrings. Anhand dieser Stringrepräsentation wissen wir dann ob du iso-8859-1 oder z.B. UTF-8 zurück bekommst. Anhand dieser Informationen können wir dir sagen, was zu tun ist.

Wenn du ein Beispiel selber schreibst und den Text einfach hin schreibst und nicht die Datenbank abfragst, wie sollen wir dann zu diesen Informationen kommen... :K

mfg
Gerold
:-)

Verfasst: Dienstag 20. März 2007, 20:34
von sauerkraut
Ok, mein Fehler...

Also ich bekomme jetzt folgendes heraus:

Code: Alles auswählen

repr:  u'BARMHERZIGE BR\xdcDER'
type:  <type 'unicode'>
Wie bekomme ich jetzt das ganze in Python in einen String umgewandelt, damit ich mit diesem String weiterarbeiten kann.

Nochmal danke für die zahlreiche Hilfe.

Verfasst: Dienstag 20. März 2007, 21:08
von Leonidas
sauerkraut hat geschrieben:Wie bekomme ich jetzt das ganze in Python in einen String umgewandelt, damit ich mit diesem String weiterarbeiten kann.
Das ist schon ein String: Ein Unicode-String. Damit kannst du wunderbar arbeiten. Sogar besser als mit Byte-Strings.

Verfasst: Dienstag 20. März 2007, 21:12
von jens
Dafür ist [wiki]Zeichensatz ermitteln[/wiki]ganz nett.

Ausgaben:
LORENZ-B烺LER-UKH-NOTAUFNAHME - codec: big5
LORENZ-B烺LER-UKH-NOTAUFNAHME - codec: big5hkscs
<|êá+!âOç<áêí.ç+|è íã+ ç(á - codec: cp037
<|ךה+!בOח<הךם.ח+|לאםו+אח(ה - codec: cp424
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp437
<!êá+]âOç<áêí.ç+!è íã+ ç(á - codec: cp500
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp737
LORENZ-BųHLER-UKH-NOTAUFNAHME - codec: cp775
LORENZ-BÍHLER-UKH-NOTAUFNAHME - codec: cp850
LORENZ-BÍHLER-UKH-NOTAUFNAHME - codec: cp852
LORENZ-BоHLER-UKH-NOTAUFNAHME - codec: cp855
LORENZ-BÍHLER-UKH-NOTAUFNAHME - codec: cp857
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp860
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp861
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp862
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp863
LORENZ-BﺿHLER-UKH-NOTAUFNAHME - codec: cp864
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp865
LORENZ-B╓HLER-UKH-NOTAUFNAHME - codec: cp866
LORENZ-BαHLER-UKH-NOTAUFNAHME - codec: cp869
LORENZ-BึHLER-UKH-NOTAUFNAHME - codec: cp874
<!ΛΕ+]ΒOΘ<ΕΛΞ.Θ+!ΝΑΞΖ+ΑΘ(Ε - codec: cp875
LORENZ-BヨHLER-UKH-NOTAUFNAHME - codec: cp932
LORENZ-B烺LER-UKH-NOTAUFNAHME - codec: cp950
LORENZ-BﻅHLER-UKH-NOTAUFNAHME - codec: cp1006
<!êá+ĞâO{<áêí.{+!è íã+ {(á - codec: cp1026
<|êá+!âOç<áêí.ç+|è íã+ ç(á - codec: cp1140
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: cp1250
LORENZ-BЦHLER-UKH-NOTAUFNAHME - codec: cp1251
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: cp1252
LORENZ-BΦHLER-UKH-NOTAUFNAHME - codec: cp1253
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: cp1254
LORENZ-BײHLER-UKH-NOTAUFNAHME - codec: cp1255
LORENZ-BضHLER-UKH-NOTAUFNAHME - codec: cp1256
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: cp1257
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: cp1258
LORENZ-B諬LER-UKH-NOTAUFNAHME - codec: gbk
LORENZ-B諬LER-UKH-NOTAUFNAHME - codec: gb18030
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: latin_1
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_2
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_3
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_4
LORENZ-BжHLER-UKH-NOTAUFNAHME - codec: iso8859_5
LORENZ-BضHLER-UKH-NOTAUFNAHME - codec: iso8859_6
LORENZ-BΦHLER-UKH-NOTAUFNAHME - codec: iso8859_7
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_9
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_10
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_13
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_14
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: iso8859_15
LORENZ-BжHLER-UKH-NOTAUFNAHME - codec: koi8_r
LORENZ-BжHLER-UKH-NOTAUFNAHME - codec: koi8_u
LORENZ-B÷HLER-UKH-NOTAUFNAHME - codec: mac_cyrillic
LORENZ-B÷HLER-UKH-NOTAUFNAHME - codec: mac_greek
LORENZ-B÷HLER-UKH-NOTAUFNAHME - codec: mac_iceland
LORENZ-B÷HLER-UKH-NOTAUFNAHME - codec: mac_latin2
LORENZ-B÷HLER-UKH-NOTAUFNAHME - codec: mac_roman
LORENZ-B÷HLER-UKH-NOTAUFNAHME - codec: mac_turkish
LORENZ-BЦHLER-UKH-NOTAUFNAHME - codec: ptcp154
LORENZ-BヨHLER-UKH-NOTAUFNAHME - codec: shift_jis
LORENZ-BヨHLER-UKH-NOTAUFNAHME - codec: shift_jis_2004
LORENZ-BヨHLER-UKH-NOTAUFNAHME - codec: shift_jisx0213
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: palmos
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: raw_unicode_escape
LORENZ-BÖHLER-UKH-NOTAUFNAHME - codec: unicode_escape