unicode und 8 Bit Ascii

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
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

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
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
Zuletzt geändert von gerold am Freitag 24. März 2006, 17:01, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Da wäre auch noch eine Frage von mir... Was soll mit Zeichen, die nicht in ASCII rein passen, passieren???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Genau, da ist ein Fehler im Titel dieser Diskussion: Es gibt kein 8-Bit ASCII. ASCII ist ein 7-Bit Code.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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?
--- Heiko.
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

:-)

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
BlackJack

Ich würde trotzdem nicht den "quick'n'dirty" Weg wählen. recode kennt zum Beispiel ``EBCDIC-AT-DE``.
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

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
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?
mbierenfeld
User
Beiträge: 39
Registriert: Donnerstag 9. Dezember 2004, 22:02
Wohnort: Muenchen

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
Antworten