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

Hey Leute,

kann mir mal bitte einer sagen, was fürn Idiot ich bin und mir erzählen, wie ich den Wert eines Zeichens rauskriege und aus dem Wert wieder das Zeichen.. ? Ich habs mal mit ord("ö") versucht und dann chr(246) = '\xf6'

Aber die Nummer lief nicht so gut ^^ Ich würde gerne mit utf-8 arbeiten. Reicht es dafür das #encoding einzufügen oder muss ich die Datei auch anders abspeichern.. ?
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
BlackJack

Was ist für Dich der "Wert eines Zeichens"? Und was hat UTF-8 damit zu tun? Dort ist nicht jedes Zeichen mit *einem* Wert darstellbar.

Schon die Wikiseite zu Unicode & Co gelesen? [wiki]Von Umlauten, Unicode und Encodings[/wiki]
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich glaube, ich weiß was du meinst. Guck mal hier:

Code: Alles auswählen

In [1]: s = 'ö'

In [2]: s
Out[2]: '\xf6'

In [3]: print s
ö

In [4]: s = '\xf6'

In [5]: s
Out[5]: '\xf6'

In [6]: print s
ö
BlackJack

Und guck mal hier:

Code: Alles auswählen

In [121]: s = 'ö'

In [122]: s
Out[122]: '\xc3\xb6'

In [123]: print s
ö
Und nun!?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

BlackJack hat geschrieben:Und nun!?
...bin ich verwirrt. Ist das systemabhängig?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Dann will ich auch mal :)

Code: Alles auswählen

>>> s = 'ö'
>>> s
'ö'
>>> print(s)
ö
>>> öäüß = 'umlaute'
>>> öäüß
'umlaute'
Bong-Jour
User
Beiträge: 54
Registriert: Donnerstag 24. Juli 2008, 13:14
Kontaktdaten:

Ich will wie man mit ord() den ascii-Wert des Zeichens ermitteln kann, diesen auch für "ö"-s und "ä"-s und Co haben
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Unicode nennt den "Wert eines Zeichen" den Codepoint. Dies ist die Zahl, die das Zeichen eindeutig im Katalog aller Zeichen beschreibt. Je nach Encoding wird dieser dann in ein oder mehr Bytes beschrieben. Für ein "ö" wäre das für UTF-8 0xC3 und 0xB6. Für UTF-16BE dann 0x00 0xF6, für UTF-16LE ist's umgekehrt und es ist 0xF6 0x00. Für ISO-8859-1 oder ISO-8859-15 wäre es 0xF6. Mit ASCII hat das alles wenig zu tun, denn streng genommen, ist dies ein 7-Bit-Code und das "ö" ist nicht Teil des ASCII-Zeichensatz.

Interessanterweise sind die ersten 128 Zeichen von ISO-8859-1 die selben wie die von ASCII und die ersten 256 Zeichen von Unicode haben die selben Codepoints wie die Zeichen im ISO-8859-1-Zeichensatz.

Wenn du mit Strings in Python hantierst, tue dir den Gefallen und benutze immer Unicode-Strings (die mit dem u-Präfix bei Python 2.x) denn erstens sind sie das, was Python 3.x nur noch hat und zweitens gibt es keine Überraschungen, wie Zeichen außerhalb des ASCII-Zeichenvorrats wohl funktionieren. Dann gibt es unichr() und uniord(), um den Codepoint eines Zeichens zu bestimmen bzw. aus einem Codepoint einen String mit diesem Zeichen zu machen. Die Methode encode() dient dann dazu, Strings als Bytearray (str bzw. bytes) in einem bestimmten Encoding darzustellen.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:
BlackJack hat geschrieben:Und nun!?
...bin ich verwirrt. Ist das systemabhängig?
Ja. Ich meine dass man es über das Locale einstellen kann (ich habe hier ``en_US@UTF-8``) und bei mir kommt - wie bei BlackJack auch - UTF-8 raus. Was dein Code-Snippet zeigt ist dass du Latin-1 oder ähnliches verwendest, mehr nicht.

Kannst also nicht so einfach diese wunderbar sinnvollen Zeichen verwenden: ♨♾♹⚰⚱. SCNR
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:

Ich hab mich jetzt aber auf die utf-8 Variante fixiert ^^ Und da ich sowieso nicht klar komme, ist die Umstellung auf eine neue Pythonversion sicherlich nicht das Richtige für mich ^^

Wie kann ich mir einen String den binär anzeigen lassen ? Bzw. wie oder wo kann ich alle Zeichen des utf-8 einsehen ? Dann erstell ich mir eben meine eigene Tabelle mit Werten :)
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bong-Jour hat geschrieben:Wie kann ich mir einen String den binär anzeigen lassen ?
Naja, du nimmst jeden Bytewert und zeigst diese Zahl die zwischen 0 und 255 als 8-zeichen lange Sequenz von Nullen und Einsen an. Wie das geht wurde oft gefragt und du findest einige Lösungen mit der Forensuche. Ist aber völlig unnötig, wozu will man denn die Binäransicht eines Strings haben?
Bong-Jour hat geschrieben:Bzw. wie oder wo kann ich alle Zeichen des utf-8 einsehen ?
Hier zum Beispiel. Aber nimm dir dafür Urlaub, es sind nämlich ziemlich viele.
Bong-Jour hat geschrieben:Dann erstell ich mir eben meine eigene Tabelle mit Werten :)
Ein Dict mit Millionen von Keys? :roll: Wo dann so Perlen wie etwa BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA vorkommen? :)
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:

Leonidas hat geschrieben:Naja, du nimmst jeden Bytewert und zeigst diese Zahl die zwischen 0 und 255 als 8-zeichen lange Sequenz von Nullen und Einsen an.
Wie komme ich denn an den Bytewert.. ? Bzw. Wonach muss ich im Forum suchen ? ;)
Leonidas hat geschrieben:Aber nimm dir dafür Urlaub, es sind nämlich ziemlich viele.
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" ^^
Leonidas hat geschrieben:Ein Dict mit Millionen von Keys?
Wie greift der Computer denn auf diese Zeichen zu.. ? Der muss die Million doch auch irgendwo abgespeichert haben.. ?
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht hast du ja Glück und es gibt ein Modul für sowas...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Bong-Jour hat geschrieben:Wie kann ich mir einen String den binär anzeigen lassen ? Bzw. wie oder wo kann ich alle Zeichen des utf-8 einsehen ? Dann erstell ich mir eben meine eigene Tabelle mit Werten
Falsche Fragen.

String binär anzeigen lassen geht nicht. Du kannst dir die Bytes eines Encodings eines Strings anzeigen lassen. Wenn dir eine Hexadezimaldarstellung reicht, versuche mal `"foo".encode("hex")`.

UTF-8 hat keine Zeichen. UTF-8 ist ein Encoding. Unicode hat Zeichen. Deren Codepoints kann man mittels UTF-8 (oder UTF-16BE, UTF-16LE, UTF-32 usw.) kodieren. Unicode 5.1 definiert ein bisschen mehr als 100.000 Zeichen. Siehe http://www.unicode.org/versions/Unicode5.1.0/. Millionen, wie Leonidas meinte, sind das also (noch) nicht.

Und eine Tabelle brauchst du nicht. Das Modul "unicodedata" kennt (wenigstens einige der) Unicode-Namen und dient zur Umwandlung.

Stefan
Bong-Jour
User
Beiträge: 54
Registriert: Donnerstag 24. Juli 2008, 13:14
Kontaktdaten:

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.. ? ;)
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
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!
Antworten