String zusammensetzen

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.
BlackJack

@Sr4l: Das muss man nicht mit den Literalen Zeichenketten durchziehen. Nur wenn da etwas ausserhalb von ASCII enthalten ist. Dann fliegt einem an der entsprechenden Stelle aber auch eine Ausnahme um die Ohren.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Sr4l hat geschrieben:*edit* noch etwas, dein "\xf6" ist latin-1 kein utf-8 ("\xc3\xb6")
Die escape-Sequenz \x.. in Unicode-Strings bedeutet einfach, dass ein Unicode-Zeichen als 2-stellige Hexzahl angegeben wird
und ist äquivalent zu \u00xx.
Solange sich Strings auf 7bit beschränken lassen sich Unicode- und Byte-Strings in Python ohne weitere Umwandlung kombinieren.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

BlackJack hat geschrieben:@Sr4l: Das muss man nicht mit den Literalen Zeichenketten durchziehen. Nur wenn da etwas ausserhalb von ASCII enthalten ist. Dann fliegt einem an der entsprechenden Stelle aber auch eine Ausnahme um die Ohren.
Kann dir jetzt nicht ganz folgen. Mit "nur wenn außerhalb von ASCII" meinst du: "kein literal", u"beim bösen aber schon" ?

Bei mir funktioniert das aber nicht mit .format().

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
for name in [u"a", u"ä", u"ö", u"ü"]:
    print repr(name)
    print repr(u"{0}".format(name))
    print repr("{0}".format(name))
u'a'
u'a'
'a'
u'\xe4'
u'\xe4'
Traceback (most recent call last):
File "test.py", line 6, in <module>
print repr("{0}".format(name))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 0: ordinal not in range(128)
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Code: Alles auswählen

In [1]: u = u"ä"

In [2]: s = "s"

In [3]: s + u
Out[3]: u's\xe4'

In [4]: "%s%s"%(s, u)
Out[4]: u's\xe4'

In [5]: "{} {}".format(s, u)
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-5-800d004aa231> in <module>()
----> 1 "{} {}".format(s, u)

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 0: ordinal not in range(128)

In [6]: " ".join([s, u])
Out[6]: u's \xe4'

In [7]: 
Das ist ein Bug oder?

Alle Varianten von str + unicode ergeben unicode, außer bei format?!
BlackJack

@Sr4l: `str.format()` scheint tatsächlich nur mit `str` beziehungsweise `unicode` im ASCII-Bereich klar zu kommen. Bin ich bis jetzt noch nicht drüber gestolpert — ich verwende wohl immer noch zu oft den ``%``-Operator. :-)
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

BlackJack hat geschrieben:@Sr4l: `str.format()` scheint tatsächlich nur mit `str` beziehungsweise `unicode` im ASCII-Bereich klar zu kommen. Bin ich bis jetzt noch nicht drüber gestolpert — ich verwende wohl immer noch zu oft den ``%``-Operator. :-)
Klasse, mit dem ``%``-Operator geht es.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du hast jetzt nicht wirklich das überlegene format durch % ersetzt, anstatt vor den Formatstring einfach ein u zu schreiben, oder?
Das Leben ist wie ein Tennisball.
Antworten