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.. ?
Encoding, Zeichenwert rauskriegen
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
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]
Schon die Wikiseite zu Unicode & Co gelesen? [wiki]Von Umlauten, Unicode und Encodings[/wiki]
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
ö
Und guck mal hier:
Und nun!?
Code: Alles auswählen
In [121]: s = 'ö'
In [122]: s
Out[122]: '\xc3\xb6'
In [123]: print s
ö
Dann will ich auch mal
Code: Alles auswählen
>>> s = 'ö'
>>> s
'ö'
>>> print(s)
ö
>>> öäüß = 'umlaute'
>>> öäüß
'umlaute'
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!
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
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
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.snafu hat geschrieben:...bin ich verwirrt. Ist das systemabhängig?BlackJack hat geschrieben:Und nun!?
Kannst also nicht so einfach diese wunderbar sinnvollen Zeichen verwenden: ♨♾♹⚰⚱. SCNR
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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
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!
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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:Wie kann ich mir einen String den binär anzeigen lassen ?
Hier zum Beispiel. Aber nimm dir dafür Urlaub, es sind nämlich ziemlich viele.Bong-Jour hat geschrieben:Bzw. wie oder wo kann ich alle Zeichen des utf-8 einsehen ?
Ein Dict mit Millionen von Keys? Wo dann so Perlen wie etwa BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA vorkommen?Bong-Jour hat geschrieben:Dann erstell ich mir eben meine eigene Tabelle mit Werten
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Wie komme ich denn an den Bytewert.. ? Bzw. Wonach muss ich im Forum suchen ?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.
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:Aber nimm dir dafür Urlaub, es sind nämlich ziemlich viele.
Wie greift der Computer denn auf diese Zeichen zu.. ? Der muss die Million doch auch irgendwo abgespeichert haben.. ?Leonidas hat geschrieben:Ein Dict mit Millionen von Keys?
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
Falsche Fragen.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
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
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!
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'
NEIN. Zwei Hexziffern stellen ein BYTE da. BYTE != ZEICHEN! Das kann doch nicht so schwer zu verstehen sein.Bong-Jour hat geschrieben:Die Bytes reichen mir ja schon. >>>"foo".encode("hex") == '666f6f'. Stellen jeweils 2 Hexzeichen einen Buchstaben dar.. ?
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'
Stefan
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Encode, UTF-8, decimal to binary (manchmal fälschlciherweise auch als int2bin bekannt)Bong-Jour hat geschrieben:Wie komme ich denn an den Bytewert.. ? Bzw. Wonach muss ich im Forum suchen ?
Mache ich in der Regel nicht, sofern es gerechtfertigt ist. Aber das klingt jetzt eher nach OfftopicBong-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" ^^
Schau mal in unicodedata.Bong-Jour hat geschrieben:Wie greift der Computer denn auf diese Zeichen zu.. ? Der muss die Million doch auch irgendwo abgespeichert haben.. ?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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 =)NEIN. Zwei Hexziffern stellen ein BYTE da. BYTE != ZEICHEN!
Das ist kein Hakenkreuz - Das ist das neue Python-Symbol!
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>
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!