Tabelle mit Asci zeichen wie anlegen (besten)

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.
patrickk

Hallo,

die daten kommen als xml, dann wird der 'text', der als base64 kodiert ist von mir von hex nach binary geaendert. Dafuer habe ich einfach eine Tabelle gemacht "3":"0011". Die Daten schreibe ich alle hintereinander in einen String. Warum. Ich muss es nach GSM 7 bit default alphabet dekodieren. Da habe ich leider nichts gefunden und habe die Tabelle angelegt. Diese hat nur 7 bit, und das erste von dem octet wird hinten an das folgende gehaengt..., also mit jedem schritt vorne ein zeichen mehr streichen und hinten bekommt man mehr angehaengt... Aber das klappt alles. Danach benutze ich die tabelle um den 7 bit das passende zeichen zuzuordnen. Bei den normalen Buchstaben ist das auch kein Problem. Aber bei z.b. dem sect sign. Ich moechte die Daten als utf-8 in eine Datei schreiben. Habe die zuordnung so gemacht:
"0010100":u'f'.
Probleme bereitet das natuerlich bei allen Zeichen die ein ' beinhalten.
patrickk

Hallo,

die daten kommen als xml, dann wird der 'text', der als base64 kodiert ist von mir von hex nach binary geaendert. Dafuer habe ich einfach eine Tabelle gemacht "3":"0011". Die Daten schreibe ich alle hintereinander in einen String. Warum. Ich muss es nach GSM 7 bit default alphabet dekodieren. Da habe ich leider nichts gefunden und habe die Tabelle angelegt. Diese hat nur 7 bit, und das erste von dem octet wird hinten an das folgende gehaengt..., also mit jedem schritt vorne ein zeichen mehr streichen und hinten bekommt man mehr angehaengt... Aber das klappt alles. Danach benutze ich die tabelle um den 7 bit das passende zeichen zuzuordnen. Bei den normalen Buchstaben ist das auch kein Problem. Aber bei z.b. dem sect sign. Ich moechte die Daten als utf-8 in eine Datei schreiben. Habe die zuordnung so gemacht:
"0010100":u'f'.
Probleme bereitet das natuerlich bei allen Zeichen die ein ' beinhalten.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Aha, das hört sich entlich mal interessant an ;)

Also du willst deine Zuordnungstabelle in eine Datei festhalten??? Dafür könntest du doch pickle nehmen.
Beim öffnen einer Datei kannst du ein encoding festlegen, z.B.:

Code: Alles auswählen

f = file( "test.txt", "wb", encoding="utf-8" )
Wenn du diese Datei in einem Editor öffnest, mußt du darauf achten, das er die Datei auch mit UTF-8 Darstellt! Ansonsten hast du fehlerhaft aussehende Daten!

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

Hallo,

ich erstelle die Datei selbst in die ich den Inhalt schreibe. Da hast Du mir aber schon einen hilfreichen Tipp gegeben.
so mache ich es. final ist hierbei der string aus den Zeichen nach der tabelle. Also: u'I'+u'c'+u'h'
f.write(codecs.BOM_LE)
final_utf=final.encode("UTF-8")
f.write(final_utf)
Sollte das so korrekt sein? Die encode utf zeile ist vielleicht unnoetig.
Mein Problem sind eher Zeichen wie: §
Habe aus Office, Sonderzeichentabelle, die Zeichen in meine Tabelle kopiert. Aber da meckert er. Ich glaube, dass das Zeichen irgendwie in einer darstellung mit ' gesehen wird. Damit macht: "1001010":u'A'' nat. ein problem. Was mache ich da am besten?


Danke,


Patrick
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Kannst du nicht mal deinen ganze Source-Code posten? Wird ja nicht so viel sein... Ich denke dann kann man dir besser folgen...

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

habe gerade das § Zeichen in die Tabelle gestellt und bekomme diese Fehlermeldung:

line 39
"1011011":u'AD',"1011100":u'AV',"1011101":u'AQ',"1011110":u'A\',"1011111":u'A'',"1100101":u'e',
^
SyntaxError: invalid syntax

1011111 wird hier wegen dem '' glaube ich falsch. Wie mache ich hier am besten die Zuordnung?

sorry, bin noch neu in python und das iso... Latin utf bereitet mir noch grosse Probleme...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Erstmal aufräumen:

table = {
"1011011":u'AD',
"1011100":u'AV',
"1011101":u'AQ',
"1011110":u'A\',
"1011111":u'A'',
"1100101":u'e',
}

Die beiden Zeilen sind natürlich das Problem:
"1011110":u'A\',
"1011111":u'A'',

Ist auch klar, bei \ ein Sonderzeichen ist, welches escapted werden muß. Außerdem ist die "Klammer" falsch. So geht's richtig:
"1011110":u'A\\',
"1011111":u"A'",

Allerdings, was soll denn ein A\ und ein A' sein???

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ach, du wandelst base64 nach hex, dann hex nach binär und dann binär zu echte Zeichen???

Warum der Umweg? Kannst doch auch eine Tabelle mit hex nach binär, oder so, machen...
Zuletzt geändert von jens am Donnerstag 18. August 2005, 09:27, insgesamt 2-mal geändert.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Hi,


der Umweg, da ich die Decodierung selber gemacht habe. GSM 7 bit gibt es leider nicht (das ich wuesste...)
7bit zu zeichen. Ist nicht die ascii tabelle...
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Zum bessen verständniss, dessen was du genau machst, schreib doch einfach mal einen Kleinen Ablaufplan, Stück für Stück.

Ich fang mal an:

- Daten von GSM als XML erhalten
- base64 Daten aus XML extrahieren
- extrahierte Daten nach hex wandeln
- hex nach binär wandeln
- binär nach ascii wandeln
- Daten in Datei schreiben

Verbesser das mal...
Also die base64 Daten sind in GSM-7bit codiert, oder was?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

- Daten von GSM als XML erhalten
- (base64 Daten) aus XML extrahieren durch pickle.dumps ist es bereits decodiert...
- extrahierte Daten nach hex wandeln
- hex nach binär wandeln
- binär nach eigener Tabelle in entsprechende Zeichen wandeln (habe u'' verwendet)
- Daten in Datei schreiben (utf-8)

Problem: nur ein paar Zeichen in der Tabelle. Wie kann ich z.B. dieses Zeichen setzen:
?, oder ?...
Kennt jmd. den character von denen? oder eine Seite, wo ich die finden kann... und wie gibt man so ein zeichen ein, wenn man es gefunden hat. z.b. iso 8859-1 character set...

Wie kann ich sagen: a = '/xa5' als latin deuten, aber als utf-8 richtig speichern?
Am besten waere wohl eine komplette utf-8 tabelle. Alles was da nicht drinnen ist kann ich auch nicht speichern... oder?
Weiss jmd wo es so eine seite gibt?


patrick
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

patrickk hat geschrieben:- (base64 Daten) aus XML extrahieren durch pickle.dumps ist es bereits decodiert...
Also das verstehe ich überhaupt nicht... Wie können base64 Daten durch pickle.dumps decodiert werden??? Das macht für mich absolut keinen Sinn.
patrickk hat geschrieben: - extrahierte Daten nach hex wandeln
- hex nach binär wandeln
- binär nach eigener Tabelle in entsprechende Zeichen wandeln (habe u'' verwendet)
OK, "extrahierte Daten nach hex wandeln" machst du also mit binascii.b2a_hex()
Aber die beisen weiteren Schritte erscheinen mir nicht optimal gelöst zu sein.
Warum erstellst du nicht eine hex<->Zeichen Tabelle??? Warum der Umweg über binär-Code???


patrickk hat geschrieben:Problem: nur ein paar Zeichen in der Tabelle. Wie kann ich z.B. dieses Zeichen setzen:
?, oder ?...
Kennt jmd. den character von denen? oder eine Seite, wo ich die finden kann...
Schau mal auf http://decodeunicode.org nach.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Zeig uns mal die ursprungsdaten, sag uns in welchem format die sind und in welchem format du sie haben möchtest ganz am schluss.

Gruss
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Hi,

nein ich habe eine selbst erstellte tabelle, die einfach zeichen setzt. diese werden als in einen string konvertiert und dann in eine utf-8 datei geschrieben. Das hat mit xml... nichts zu tun. Weiss nur nicht wie ich manche Zeichen anlegen soll. BSP. z.b. findet man in der ascii tabelle ein ü. wie kann man das speichern?

>>> a ="ü"
>>> b =a.decode( "latin1" ).encode( "utf8" )
>>> b
'\xc3\x83\xc2\xbc'
>>> print (b)
ü

egal was ich mache, es kommt nie das Zeichen wieder raus?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

patrickk hat geschrieben:egal was ich mache, es kommt nie das Zeichen wieder raus?
Das liegt allerdings wahrscheinlich daran, das dein Editor/Shell keine UTF8 unterstützung an hat! Denn ü sieht für mich nach einem UTF8 kodiertes Zeichen aus, welches nur nicht als solches Dargestellt wird!

Schreib das Zeichen mal in eine Datei rein. Diese dann im SciTE öffnen und dann unter File/Encoding auf UTF8 stellen... Dann solltest du wieder ein "ü" sehen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

a ='ü'
>>> b =a.encode( "utf8" )
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Hab das Problem entdeckt:

Wenn man a = u'ü' setzt kommt immer ein anderes Zeichen raus, wenn man a = 'ü' setzt geht es, aber wie mache ich dann eine utf-8 datei daraus, s.o. es erscheint eine fehlermeldung?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also bei mir klappt beide varianten:

Code: Alles auswählen

f = file( "test.txt", "w" )
f.write( "äöü" )
f.close
produziert auch eine UTF8 konvertierte Text-Datei, obwohl nirgendwo etwas von utf8 angegeben wurde. Warum Python dennoch utf8 verwendet weiß nicht nicht...

Allerdings gibt's ein Fehler bei f.write( u"äöü" ) !

oder

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import codecs
f = codecs.open('test.txt','wb', encoding="utf-8" )
f.write( u"äöü" )
f.close()
In dieser Variante muß es mit u"äöü" gemacht werden. Hierbei ist auch die Angabe # -*- coding: UTF-8 -*- wichtig!

In beiden Varanten wird eine Textdatei erstellt mit dem Inhalt äöü (Wenn man es sich mit normalen 8Bit Encoding anschaut!) Erst wenn ich im SciTE editor auf utf8-datei-encodierung umschalte sehe ich mein äöü-String richtig, was ja normal ist!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Hallo,

kann jetzt mit print (a) das z.b. ü richtig anzeigen lassen.

Ich mache es so:
a=u'ü'
b=a.encode('latin-1')
print(b)

Aber in der datei klappt es nicht??

f = file('/home/'+curtime+'zz','wt')
f.write(codecs.BOM_LE)
final_utf=final.encode("latin-1")
f.write(final_utf)
f.close()

Ist doch so richtig, oder? Ich schaue die datei mit kwrite an. Ich kann nach latin wechseln... es sieht immer faslch aus:

Flughafen K&#xf6;ln/Bonn
was mache ich nich immer falsch???
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich dachte du willst utf8 haben... OK dann probiere es dochmal hiermit:

Code: Alles auswählen

import codecs
f = codecs.open( '/home/'+curtime+'zz', 'wb', encoding="latin-1" )
f.write( final )
f.close()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

Hallo, so bekomme ich immer einen syntax fehler. Daher habe ich es wie oben gemacht. stimmt hier etwas nicht? Ich will keine datei oeffnen...
import codecs
f= codecs.open( '/home/'+curtime+'zz', 'wb', encoding="latin-1" )

Patrick

Die Probleme mit den umlauten und utf-8 haben bestimmt damit zu tun, dass utf8 Ascii entspricht, aber nur bis 128. Dann fangen die umlaute... an.
Antworten