Encoding, Zeichenwert rauskriegen

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.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

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'
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Bong-Jour
User
Beiträge: 54
Registriert: Donnerstag 24. Juli 2008, 13:14
Kontaktdaten:

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 =)
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
Bong-Jour
User
Beiträge: 54
Registriert: Donnerstag 24. Juli 2008, 13:14
Kontaktdaten:

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>
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
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.
Bong-Jour
User
Beiträge: 54
Registriert: Donnerstag 24. Juli 2008, 13:14
Kontaktdaten:

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
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
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.
Bong-Jour
User
Beiträge: 54
Registriert: Donnerstag 24. Juli 2008, 13:14
Kontaktdaten:

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
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

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'
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Bong-Jour
User
Beiträge: 54
Registriert: Donnerstag 24. Juli 2008, 13:14
Kontaktdaten:

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" ^^)
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
Antworten