Seite 1 von 2

Verfasst: Donnerstag 19. Februar 2009, 13:45
von BlackVivi
Bong-Jour hat geschrieben:Die Bytes reichen mir ja schon. >>>"foo".encode("hex") == '666f6f'. Stellen jeweils 2 Hexzeichen einen Buchstaben dar.. ? Und noch viel wichtiger: Wie kriege ich aus den Hexwerten meinen Text zurück.. ? ;)

Code: Alles auswählen

In [2]: u"foo".encode("hex")
Out[2]: '666f6f'

In [3]: u"foo".encode("hex").decode("hex")
Out[3]: 'foo'

Verfasst: Donnerstag 19. Februar 2009, 14:02
von sma
Bong-Jour hat geschrieben:Die Bytes reichen mir ja schon. >>>"foo".encode("hex") == '666f6f'. Stellen jeweils 2 Hexzeichen einen Buchstaben dar.. ?
NEIN. Zwei Hexziffern stellen ein BYTE da. BYTE != ZEICHEN! Das kann doch nicht so schwer zu verstehen sein.

Das €-Zeichen (Unicode-Name: EURO SIGN, Codepoint 8364) wird zum Beispiel bei UTF-32 als 4 BYTES dargestellt. Wie man hier sieht:

Code: Alles auswählen

>>> u"€".encode("utf-32le").encode("hex")
'ac200000'
In der UTF-8-Kodierung wären es 3 Zeichen (0xE2 0x82 0xAC). Mit CP1252 kodiert wäre es ein Zeichen (0x80) und mit ISO-8859-15 auch nur ein Zeichen, aber ein anderes: 0xA4. Macroman kodiert das Zeichen als 0xDB. Es ist aber immer das selbe Zeichen.

Stefan

Verfasst: Donnerstag 19. Februar 2009, 14:33
von Leonidas
Bong-Jour hat geschrieben:Wie komme ich denn an den Bytewert.. ? Bzw. Wonach muss ich im Forum suchen ? ;)
Encode, UTF-8, decimal to binary (manchmal fälschlciherweise auch als int2bin bekannt)
Bong-Jour hat geschrieben:Es ist leider traurige Realität in Deutschland, dass einem kein Urlaub zusteht, wenn man keine Arbeit hat. Ich könnte jetzt weitere Dinge aufzählen, wo ich mich benachteiligt fühle, aber dann nennst du es wieder "Troll-Thread" ^^
Mache ich in der Regel nicht, sofern es gerechtfertigt ist. Aber das klingt jetzt eher nach Offtopic :)
Bong-Jour hat geschrieben:Wie greift der Computer denn auf diese Zeichen zu.. ? Der muss die Million doch auch irgendwo abgespeichert haben.. ?
Schau mal in unicodedata.

Verfasst: Donnerstag 26. Februar 2009, 15:01
von Bong-Jour
NEIN. Zwei Hexziffern stellen ein BYTE da. BYTE != ZEICHEN!
Aber wenn in dem Byte ein Zeichen gespeichert ist, stellen Sie dann nicht wohl eins dar... ? Danke übrigens an alle für eure schnelle Hilfe. Das mit dem encode.("hex") klappt super =)

Verfasst: Donnerstag 26. Februar 2009, 22:48
von Bong-Jour
Noch eine Sache, liebes Pythonforum:

Können in einer Webseite unterschiedliche Encodings verwendetet werden.. ? Obwohl in der Meta Angabe utf-8 steht, kriege ich folgende Fehlermeldung:

UnicodeEncodeError: 'charmap' codec can't encode character u'\u2013' in position
7930: character maps to <undefined>

Verfasst: Donnerstag 26. Februar 2009, 23:01
von BlackJack
Du hast da einen `UnicodeEncodeError`, zu dem Zeitpunkt ist der Webseiteninhalt also anscheinend schon erfolgreich dekodiert worden.

Die Frage ist also wobei Du diesen Fehler bekommst.

Verfasst: Donnerstag 26. Februar 2009, 23:48
von Bong-Jour
Kann es sein, dass read() noch 3 Zeichen vor den eigentlichen Text stellt.. ? Ohne es jetzt ausgiebig getestet zu haben und das ich es gleich revidiere: Daten[3:] scheint sich problemlos encodieren zu lassen und es fehlt auch nichts vom Text

Daten = urllib2.urlopen(urllib2.Request(Url, Parameter, Header)).read(); return Daten

Verfasst: Donnerstag 26. Februar 2009, 23:54
von BlackJack
Nein das kann nicht sein. `read()` liest nur das was der Webserver auch sendet.

Wobei ich mich hier wieder frage was Du *en*kodierst? `Daten` sind *Bytes* die kann man, zumindest was Unicode angeht, nur sinnvoll *de*kodieren.

Ich glaube Du solltest Dich wirklich mal mit dem Thema Unicode und Kodierungen beschäftigen und aufhören einfach nur wild herum zu probieren.

Verfasst: Freitag 27. Februar 2009, 00:32
von Bong-Jour
BlackJack hat geschrieben:Wobei ich mich hier wieder frage was Du *en*kodierst? `Daten` sind *Bytes* die kann man, zumindest was Unicode angeht, nur sinnvoll *de*kodieren.

Stimmt, sagt ja schon die Fehlermeldung: `UnicodeDecodeError` :D

Verfasst: Sonntag 1. März 2009, 11:38
von INFACT
hab auch mal eine Funktion erstellt die ganze Sätze umwandelt.
Ist zwar sinlos, aber egal:

Code: Alles auswählen

def str2char(string):
        end=""
        for element in string:
                end=end+"/"+hex(ord(element))
        return end
und ein beispiel:

Code: Alles auswählen

>>> str2char("ein Satz mit Umlauten und Zeichen: öäü°!\"§$%&/()=")
'/0x65/0x69/0x6e/0x20/0x53/0x61/0x74/0x7a/0x20/0x6d/0x69/0x74/0x20/0x55/0x6d/0x6c/0x61/0x75/0x74/0x65/0x6e/0x20/0x75/0x6e/0x64/0x20/0x5a/0x65/0x69/0x63/0x68/0x65/0x6e/0x3a/0x20/0xf6/0xe4/0xfc/0xb0/0x21/0x22/0xa7/0x24/0x25/0x26/0x2f/0x28/0x29/0x3d'

Verfasst: Sonntag 1. März 2009, 11:57
von sma
Bong-Jour hat geschrieben:Kann es sein, dass read() noch 3 Zeichen vor den eigentlichen Text stellt.. ?
Nein, aber dein Editor, mit dem du die Seite erzeugt hast, die der Webserver ausliefert, hat da einen BOM geschrieben. Das Ding wird eigentlich nur benötigt, um UTF-16LE und UTF-16BE bzw. UTF-32LE und UTF-32BE zu unterscheiden, manchmal kann man es aber auch benutzen, um UTF-8 überhaupt zu erkennen, denn U+FEFF ist kein sichtbares Zeichen.

Das gehört da aber IMHO nicht hin. Der Webserver sollte das Encoding im HTTP-Header definieren.

Stefan

Verfasst: Sonntag 8. März 2009, 20:10
von Bong-Jour
Ich bedanke mich für den Tipp mit dem BOM



(Leute mit einenr minimalen Immunität gegen Aluminium leiden wohl eher unter einer minimalen Aluminiumimmunität. Du kannst doch nicht das Adjektiv da rein "ballern" ^^)