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...
Tabelle mit Asci zeichen wie anlegen (besten)
- 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???
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???
- 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...
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.
- 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?
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?
- 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
- (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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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:- (base64 Daten) aus XML extrahieren durch pickle.dumps ist es bereits decodiert...
OK, "extrahierte Daten nach hex wandeln" machst du also mit binascii.b2a_hex()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)
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???
Schau mal auf http://decodeunicode.org nach.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...
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?
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?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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!patrickk hat geschrieben:egal was ich mache, es kommt nie das Zeichen wieder raus?
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...
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?
>>> 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?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also bei mir klappt beide varianten:
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
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!
Code: Alles auswählen
f = file( "test.txt", "w" )
f.write( "äöü" )
f.close
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 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!
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öln/Bonn
was mache ich nich immer falsch???
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öln/Bonn
was mache ich nich immer falsch???
- 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()
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.
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.
@patrikk: Du hast ganz grosse Probleme mit dem Verständnis von Unicode und Kodierungen. Bevor Du Dich nicht gründlich damit auseinandergesetzt hast, solltest Du aufhören einfach nur wild herum zu probieren.
Nachdem jetzt endlich die wirklich wichtigen Informationen bekannt sind, mal ein Versuch. Die Binärdaten sind also über Bytegrenzen hinweg gespeichert. Damit scheidet `str.translate()` aus. Das schwierigste ist das extrahieren der Werte aus den GSM kodierten Daten. Bits zu verschieben und zu maskieren ist immer ein wenig unübersichtlich.
Die Übersetzungstabelle legt man am besten in einer Unicode-Zeichenkette der Länge 128 ab. Ein Zeichen für jeden Wert, der in den GSM kodierten Daten vorkommen kann.
Das Übersetzen selbst beschränkt sich dann darauf, für jeden Wert das passende Zeichen in der Unicode-Zeichenkette abzufragen.
Die Übersetzungstabelle legt man am besten in einer Unicode-Zeichenkette der Länge 128 ab. Ein Zeichen für jeden Wert, der in den GSM kodierten Daten vorkommen kann.
Das Übersetzen selbst beschränkt sich dann darauf, für jeden Wert das passende Zeichen in der Unicode-Zeichenkette abzufragen.
Code: Alles auswählen
from itertools import imap, cycle
def unpack_7bit(data):
"""Iterates over a string with 7 bit packed data and returns integer
values between 0 and 127.
The data is treated as a bitstream where the values are encoded as blocks
of eight values in seven bytes according to the following pattern:
---- -------- -------- -------- -------- -------- -------- --------
Byte 0 1 2 3 4 5 6
---- -------- -------- -------- -------- -------- -------- --------
Bits 00000001 11111122 22222333 33334444 44455555 55666666 67777777
---- -------- -------- -------- -------- -------- -------- --------
:param data: the data as byte string.
:type data: `str`
:returns: an iterator over the values.
:rtype: iterator of `int`
"""
bytes = imap(ord, data)
tmp = bytes.next()
try:
for i in cycle(xrange(8)):
#
# The first value in each 7 byte block is the only value that has
# to be shifted right in the first byte.
#
if i == 0:
result = tmp >> 1
else:
#
# Extract the first part of the value from the first byte.
# Move the bits to the correct position and clip everything
# above bit 6.
#
result = (tmp << (7 - i)) & 127
#
# Extract the second part of the value from the second byte.
# Move the bits to the correct position and ``or`` them into
# the first part.
#
tmp = bytes.next()
result |= (tmp >> ((i + 1) % 8))
yield result
except StopIteration:
#
# If the last byte was an '8th' value then result contains this
# value and has to be returned.
#
if i == 7:
yield result
#
# Mapping GSM codes to unicode characters.
#
# There are 128 characters, written as 16 characters per line, in ISO-8859-15
# encoding. The second line contains some ``?`` where the GSM charset defines
# a couple of greek symbols which are not in ISO-8859-15.
#
gsm_unicode_map = ('@\xa3$\xa5\xe8\xe9\xf9\xec\xf2\xc7\n\xd8\xf8\r\xc5\xe5'
'?_??????????\xc6\xe6\xdf\xc9'
' !"#\xa4%&\'()*+,-./'
'0123456789:;<=>?'
'\xa1ABCDEFGHIJKLMNO'
'PQRSTUVWXYZ\xc4\xd6\xd1\xdc\xa7'
'\xbfabcdefghijklmno'
'pqrstuvwxyz\xe4\xf6\xf1\xfc\xe0').decode('iso-8859-15')
def gsm_decode(data):
"""Decodes GSM encoded text to unicode."""
return ''.join(gsm_unicode_map[code] for code in unpack_7bit(data))
Noch eine kleine Ergänzung. Die fehlenden griechischen Zeichen und der erweiterte GSM Zeichensatz sollten jetzt auch unterstützt werden.
Der Syntaxhighlighter mag irgendwie kein Semikolon in Zeichenketten!? Bug oder Feature?
Code: Alles auswählen
#
# Mapping GSM codes to unicode characters.
#
# There are 128 characters, written as 16 characters per line, except line 2
# which is splitted across two lines because it's length.
#
gsm_unicode_map = (u'@\xa3$\xa5\xe8\xe9\xf9\xec\xf2\xc7\n\xd8\xf8\r\xc5\xe5'
u'\u0394_\u03a6\u0393\u039b\u03a9\u03a0\u03a8\u03a3\u0398'
u'\u039e?\xc6\xe6\xdf\xc9' # <- continued line 2
u' !"#\xa4%&\'()*+,-./'
u'0123456789:;<=>?'
u'\xa1ABCDEFGHIJKLMNO'
u'PQRSTUVWXYZ\xc4\xd6\xd1\xdc\xa7'
u'\xbfabcdefghijklmno'
u'pqrstuvwxyz\xe4\xf6\xf1\xfc\xe0')
#
# Extended GSM charset. These characters are escaped by code 27.
#
gsm_extended_chars = { 10: u'\x0c',
20: u'^',
40: u'{',
41: u'}',
47: u'\\',
60: u'[',
61: u'~',
62: u']',
64: u'|',
101: u'\u20ac' }
def gsm_decode(data):
"""Decodes GSM encoded text to unicode."""
unpacked_data_iter = unpack_7bit(data)
result = list()
for code in unpacked_data_iter:
if code == 27:
result.append(gsm_extended_chars[unpacked_data_iter.next()])
else:
result.append(gsm_unicode_map[code])
return ''.join(result)