Seite 1 von 1

unicode und 8 Bit Ascii

Verfasst: Freitag 24. März 2006, 15:49
von mbierenfeld
Hallo zusammen,

ich habe eine 16Bit unicode Datei die muss nun in eine 8 Bit ascii datei gewandelt werden irgendwie funtzt dat ned mit

Code: Alles auswählen

infile = open ("DTABAND0028")

content = infile.read ()
infile.close ()

ascii = content.decode('ascii')

outfile = open ("DTABAND0028.txt", "w")
outfile.write (ascii)
outfile.close ()

kann jemand einem genervten noch schnell am freitag auf die spruenge helfen

Verfasst: Freitag 24. März 2006, 16:11
von jens
Schau dir mal codecs.open() an: http://wiki.python.de/Von_Umlauten%2C_U ... _Encodings (ganz unten)

http://wiki.python.de/Tags/Unicode

Im Übrigen sieht dein Quellencode recht komisch aus. Man macht keine Leerzeichen: bla () -> bla() :lol:

Schon klar nur

Verfasst: Freitag 24. März 2006, 16:24
von mbierenfeld
Danke fuer die Antwort,

ich habe es nun so drin. Ist immer noch nicht das was ich brauche.

Das problem ist die 16 bittige Darstellung versus die 8 bittige Darstellung innerhalb der Datei

ich habe es nun so drin

Code: Alles auswählen

outfile = codecs.open ("DTABAND0028.txt", "w", "utf-8")
outfile.write (content)
outfile.close ()
in der datei ist aber als hex wert fuer zBsp "0128"

0x00 0x30 0x00 0x31 0x32 0x00 0x38

sprich

0x00 0x30 = 0
0x00 0x31 = 1
0x00 0x32 = 2
0x00 0x38 = 8

ich brauche 0x30 0x31 0x32 0x38. Also 8 Bit Zeichensatz

Liebe gruesse

michael

Verfasst: Freitag 24. März 2006, 16:38
von gerold
Hi Michael!

Wenn du eine 16-Bit Unicodedatei hast, warum öffnest du sie dann mit der Einstellung "utf-8"? Da liegen Meilen (8 Bit) dazwischen. :wink:

Ah, ich sehe. Das ist der Code zum Speichern.

Was funktioniert nicht, wenn du mit utf-16 liest und mit utf-8 speicherst?

Lass uns auch mal sehen, wie du die Datei liest.

mfg
Gerold
:-)

Verfasst: Freitag 24. März 2006, 16:46
von Hannes-Spz
Lustig, das kenne ich irgendwoher... :wink:

aber versuchs doch mal mit sowas änhlichem:

Code: Alles auswählen

from string import replace
neuer_string = replace(Alter_String, "\x00", "")
es ersetzt einfach alle kästchen (0x00) durch ein leeres, eigentlich nicht
vorhandenes zeichen!

probiers aus :D

Verfasst: Freitag 24. März 2006, 16:51
von gerold
Falls deine Quelle "utf-16" ist, dann funktioniert dieser Code sicher:

Code: Alles auswählen

import codecs

f_in = codecs.open("quelle.txt", mode='r', encoding="utf-16")
f_out = codecs.open("ziel.txt", mode='w', encoding="utf-8")

for line in f_in:
    f_out.write(line)

f_in.close()
f_out.close()
mfg
Gerold
:-)

Verfasst: Freitag 24. März 2006, 16:59
von gerold
Sch...! Schon wieder ein Fehler von mir. Du willst ja gar nicht nach UTF-8 sondern nach ASCII konvertieren.

Dann musst du es damit probieren. Ich habe noch zwei Alternativen zu ASCII hinzugefügt, da ASCII mit Sicherheit fehlschlägt, wenn ein Umlaut im Text ist.

Code: Alles auswählen

f_out = codecs.open("ziel.txt", mode='w', encoding="ascii")
f_out = codecs.open("ziel.txt", mode='w', encoding="iso-8859-15")
f_out = codecs.open("ziel.txt", mode='w', encoding="iso-8859-1")
mfg
Gerold
:-)

Verfasst: Freitag 24. März 2006, 19:52
von jens
Da wäre auch noch eine Frage von mir... Was soll mit Zeichen, die nicht in ASCII rein passen, passieren???

Verfasst: Freitag 24. März 2006, 22:10
von BlackJack
Genau, da ist ein Fehler im Titel dieser Diskussion: Es gibt kein 8-Bit ASCII. ASCII ist ein 7-Bit Code.

Verfasst: Freitag 24. März 2006, 23:11
von Joghurt
Eine ganz, ganz böse Lösung wäre diese hier

Code: Alles auswählen

inf = open("DATEI", "rb")
outf = open("DATEI.txt", "wb")
while 1:
  buf = inf.read(8192) # oder was auch immer
  if not buf: 
    break
  outf.write(buf[1::2])
Dieses speichert jedes zweite Byte in die neue Datei

Verfasst: Freitag 24. März 2006, 23:48
von modelnine
Uuuh.

Warum wollten einfach alle Leute \x00 irgendwie rauskriegen? Damit hat man, zumindest wenn Umlaute im Original waren, in der Ausgabe nur noch Grütze (zumindest da wo die Umlaute waren). gerold hat doch eine richtige und gute Lösung mittels der input- und output-codec-Schnittstellen gepostet?

*juchhei*

Verfasst: Montag 27. März 2006, 09:15
von mbierenfeld
Sonnige Gruesse aus München,

quick and dirty but "Das ist genau das was ich brauche"

Code: Alles auswählen

inf = open("DATEI", "rb")
outf = open("DATEI.txt", "wb")
while 1:
  buf = inf.read(8192) # oder was auch immer
  if not buf:
    break
  outf.write(buf[1::2])
Die bösen Daten sollen dann von einem Host weiterverarbeitet werden. Der kann keine 16Bit Texte. Nur 7Bit EBCDIC.

Grüsse aus der Steinzeit

Michael

Verfasst: Montag 27. März 2006, 09:37
von jens
btw. bei http://de.wikipedia.org/wiki/EBCDIC steht das EBCDIC 8-Bit wäre und verschiedene Codepages hat...

Und für diejenigen die sich auch fragen was buf[1::2] macht:

Code: Alles auswählen

buf = "1234567890"
print buf[1::2]

buf = "x[x1x2x3x4x5x6x7x8x9x0x]x"
print buf[1::2]
Ausgabe:
24680
[1234567890]
siehe: http://docs.python.org/lib/typesseq.html#l2h-157
s[i:j:k] slice of s from i to j with step k

wie wahr

Verfasst: Montag 27. März 2006, 11:52
von mbierenfeld
:-)

Wir haben eine Codepage aus Niederoestereich bei uns auf dem Host. Ich glaube selbst die IBM weiss nicht mehr, dass es die mal gab.

danke nochmal

Verfasst: Montag 27. März 2006, 22:00
von BlackJack
Ich würde trotzdem nicht den "quick'n'dirty" Weg wählen. recode kennt zum Beispiel ``EBCDIC-AT-DE``.

schon klar

Verfasst: Dienstag 28. März 2006, 09:13
von mbierenfeld
Der quick and dirty wird nur benutzt um 16 Bit auf 8 Bit "runterzubrechen".

Die Umwandlung von UTF-8 oder sonstwas nach ebcdic geht dann mit den "normalen" Routinen ich habe dazu eine Codepage cp273.py erstellen lassen und verwende sie ganz normal mit "encode"

gruesse

michael

Re: schon klar

Verfasst: Mittwoch 29. März 2006, 06:34
von BlackJack
mbierenfeld hat geschrieben:Der quick and dirty wird nur benutzt um 16 Bit auf 8 Bit "runterzubrechen".

Die Umwandlung von UTF-8 oder sonstwas nach ebcdic geht dann mit den "normalen" Routinen ich habe dazu eine Codepage cp273.py erstellen lassen und verwende sie ganz normal mit "encode"
Warum dann diese "brutale" Methode? Kannst Du nicht einfach ganz sauber UTF-16 dekodieren und dann als cp273 wieder kodieren?

Verfasst: Mittwoch 29. März 2006, 13:56
von mbierenfeld
Hallo,

ich brauche die Daten

* sowohl auf dem Host (EBCDIC)... Aber ich denke das immer noch 16Bit / Zeichen verwendet werden nur halt dann nach EBCDIC.

* als auch auf dem SAP-System. Und selbst SAP kommt nicht mit 16 Bit / Zeichen Dateien zurecht. :-) obwohl das blöde Ding sie selbst geschrieben hat.

Also die quick and dirty brauch ich auf jeden Fall. Ist aber nicht schlimm weil im Zusammenhang mit SAP alles ein Hack ist

Grüße

Michael