Seite 1 von 2

Encoding, Zeichenwert rauskriegen

Verfasst: Mittwoch 18. Februar 2009, 20:24
von Bong-Jour
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.. ?

Verfasst: Mittwoch 18. Februar 2009, 20:36
von 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]

Verfasst: Mittwoch 18. Februar 2009, 21:06
von snafu
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
ö

Verfasst: Mittwoch 18. Februar 2009, 21:26
von 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!?

Verfasst: Mittwoch 18. Februar 2009, 21:34
von snafu
BlackJack hat geschrieben:Und nun!?
...bin ich verwirrt. Ist das systemabhängig?

Verfasst: Mittwoch 18. Februar 2009, 21:40
von derdon
Dann will ich auch mal :)

Code: Alles auswählen

>>> s = 'ö'
>>> s
'ö'
>>> print(s)
ö
>>> öäüß = 'umlaute'
>>> öäüß
'umlaute'

Verfasst: Mittwoch 18. Februar 2009, 22:14
von Bong-Jour
Ich will wie man mit ord() den ascii-Wert des Zeichens ermitteln kann, diesen auch für "ö"-s und "ä"-s und Co haben

Verfasst: Mittwoch 18. Februar 2009, 22:53
von sma
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

Verfasst: Donnerstag 19. Februar 2009, 00:37
von Leonidas
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

Verfasst: Donnerstag 19. Februar 2009, 00:39
von Bong-Jour
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 :)

Verfasst: Donnerstag 19. Februar 2009, 00:59
von Leonidas
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? :)

Verfasst: Donnerstag 19. Februar 2009, 12:18
von Bong-Jour
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.. ?

Verfasst: Donnerstag 19. Februar 2009, 12:52
von snafu
Vielleicht hast du ja Glück und es gibt ein Modul für sowas...

Verfasst: Donnerstag 19. Februar 2009, 12:55
von sma
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

Verfasst: Donnerstag 19. Februar 2009, 13:35
von Bong-Jour
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.. ? ;)

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>