Python 3 und Unicode: Warum ist das eigentlich so?

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

—˜dass seit Python 3 Text Unicode ist, finde ich erstmal sehr sinnvoll. Was mich allerdings verwirrt, ist folgendes:

Python 2

Code: Alles auswählen

>>> 'ä'
'\xc3\xa4'
>>> 'ä'.decode('utf8')
u'\xe4'
>>> print 'ä'
ä
Python 3

Code: Alles auswählen

>>> 'ä'.encode('utf8')
b'\xc3\xa4'
>>> 'ä'
'ä'
>>> print('ä')
ä
Weshalb erhalte ich unter Python 3 für ein 'ä' nicht '\xe4'? Text ist Unicode, oder? Also, weshalb ist mir schon klar, Python 3 codiert das gleich um, die Frage ist vielmehr: Aus welchem Grund gibt mir Python 3 nicht die `__repr__` (weiß nicht, wie ich das nennen soll...) zu 'ä', die nunmal '\xe4' ist.

Vielleicht hat hier jemand eine Ahnung, warum die Python Entwickler sich so entschieden haben. In meinen Augen ist das schon sehr magisch, oder sehe ich das falsch?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Python 2 ist beim Repräsentieren von Strings vorsichtig und gibt nur 7bit-ASCII Zeichen aus. Python 3 dagegen gibt alle druckbaren Unicodezeichen wieder. Das ist eine Geschmacksfrage und hat nichts magisches an sich. Das ursprüngliche Verhalten von Python2 hat sich Python 3 dagegen bei bytes bewahrt, weil Binärdaten innerhalb der druckbaren ASCII-Zeichen vielleicht doch sinnvolle Information enthalten, die man als Mensch lesen will.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Sirius3
Ich würde halt eher erwarten, dass ich für ein 'ä' das bekomme, was die Python 3 Doku sagt, dass es intern ist: Unicode. Also mit "das bekomme" meine ich eben den Unicode codepoint, also im Falle des 'ä' ein '\xe4' oder zumindest ein 228 oder wie auch immer und nicht das Zeichen, das sich dahinter verbirgt... Aber das ist wohl tatsächlich Geschmackssache.

Wie komme ich denn unter Python 3 überhaupt an den Unicode codepoint?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Die `ascii()`-Funktion sollte unter Python 3 bei Unicode-Zeichenketten die gleiche Darstellung ergeben wie `repr()` und `str()` bei Python 2.

Ansonsteng gibt es noch die `ord()`-Funktion um tatsächlich eine Zahl zu erhalten. Und `unicodedata.name()` um den Namen eines Zeichens zu bekommen.

Code: Alles auswählen

In [4]: print(ascii('ä'))
'\xe4'

In [5]: import unicodedata

In [6]: unicodedata.name('ä')
Out[6]: 'LATIN SMALL LETTER A WITH DIAERESIS'

In [7]: ord('ä')
Out[7]: 228
Antworten