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.
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> month = u'März'
>>> len(month)
4
>>>
@mutetella: Das ist ein UTF-8 kodiertes 'ä'. Wenn Du mit Text arbeiten möchtest, solltest Du `unicode` verwenden. Allerdings ist auch dort nicht sichergestellt, dass ein Buchstabe nur einen Index in der Zeichenkette umfasst.
In [181]: m = 'März'.decode('utf-8')
In [182]: m
Out[182]: u'M\xe4rz'
In [183]: len(m)
Out[183]: 4
In [184]: unicodedata.normalize('NFD', m)
Out[184]: u'Ma\u0308rz'
In [185]: len(unicodedata.normalize('NFD', m))
Out[185]: 5
Ich lese aus einer UTF-8 codierten config-Datei diverse Strings (darunter eben auch der 'März') ein
Diese Strings wandle ich zur internen Verarbeitung mit str.decode('utf8') in unicode um
Jedes mal, bevor ich einen dieser unicode-Strings auf dem Bildschirm ausgebe (oder mit str.format() verwende), codiere ich ihn mit str.encode('utf8') wieder um.
Ist das so richtig?
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
In [143]: '{0}'.format('März')
Out[143]: 'M\xc3\xa4rz'
In [144]: '{0}'.format(u'März')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
/home/claus/Daten/Python/iPython/<ipython console> in <module>()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)
:K
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
In [143]: '{0}'.format('März')
Out[143]: 'M\xc3\xa4rz'
In [144]: '{0}'.format(u'März')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
/home/claus/Daten/Python/iPython/<ipython console> in <module>()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)
:K
mutetella
Ist doch ganz klar: Bei 143 sind beides Bytestrings, die in der Kodierung der Python-Shell vorliegen. Diese kann offensichtlich mit Umlauten umgehen - die __repr__-Darstellung kommt da ja nur mangels Ausgabe.
Bei 144 ist die Sache anders: Du willst in einen Bytestring einen Unicodestring einfügen. Das impliziert eine Konvertierung. Python wandelt also den Unicodestring in einen Bytestring um. Das Default-encoding ist da eben ASCII; das umfasst aber ja nun mal keine Umlaute und daher krachts.
Probier das Bsp. aus 144 mal ohne das "ä" und lass Dir den typen des Ergebnisses anzeigen.
In [144]: '{0}'.format(u'März')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
/home/claus/Daten/Python/iPython/<ipython console> in <module>()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)
In [86]: template = '{0} {1}'.decode('utf-8')
In [87]: m = 'März'.decode('utf-8')
In [88]: y = '2011'.decode('utf-8')
In [89]: len(template.format(m, y))
Out[89]: 9
In [90]: template = u'{0} {1}'
In [91]: m = u'März'
In [92]: y = u'2011'
In [93]: len(template.format(m, y))
Out[93]: 10
Warum?
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
@/me: Woher willst Du wissen wie 'März' bei jemand anders kodiert ist? Wieso hättest Du ``m = 'März'.decode('iso-8859-15')`` verstanden? Das macht doch nur das Richtige wenn 'März' wirklich in iso-8859-15 kodiert ist.
BlackJack hat geschrieben:@/me: Woher willst Du wissen wie 'März' bei jemand anders kodiert ist? Wieso hättest Du ``m = 'März'.decode('iso-8859-15')`` verstanden? Das macht doch nur das Richtige wenn 'März' wirklich in iso-8859-15 kodiert ist.
Du hast natürlich recht. Ich hatte das mögliche Encodingformat der Datei (bzw. der Entwicklungsumgebung) außer Acht gelassen und einfach mit IDLE im Default-Modus getestet.