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:

Mittwoch 18. Februar 2009, 20:24

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

Mittwoch 18. Februar 2009, 20:36

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: 5537
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 18. Februar 2009, 21:06

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
ö
shcol (Repo | Doc | PyPi)
BlackJack

Mittwoch 18. Februar 2009, 21:26

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: 5537
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 18. Februar 2009, 21:34

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

Mittwoch 18. Februar 2009, 21:40

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:

Mittwoch 18. Februar 2009, 22:14

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

Mittwoch 18. Februar 2009, 22:53

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 19. Februar 2009, 00:37

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

Donnerstag 19. Februar 2009, 00:39

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 19. Februar 2009, 00:59

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

Donnerstag 19. Februar 2009, 12:18

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: 5537
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 19. Februar 2009, 12:52

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

Donnerstag 19. Februar 2009, 12:55

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:

Donnerstag 19. Februar 2009, 13:35

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!
Antworten