Problem mit Umlauten bei input()

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.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich frage mich, wieso Python-3-Strings keine ``.to_encoding()``-Methode haben. Das würde solche Aufgaben besonders für Anfänger erleichtern.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

snafu hat geschrieben:Ich frage mich, wieso Python-3-Strings keine ``.to_encoding()``-Methode haben. Das würde solche Aufgaben besonders für Anfänger erleichtern.
Und was soll diese Methode anderes tun als die ``encode``-Methode von Strings?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hyperion hat geschrieben:Und was soll diese Methode anderes tun als die ``encode``-Methode von Strings?
Sie würde ein ``.encode()`` und ``.decode()`` in einem Rutsch machen, wäre leichter zu merken und erfordert weniger Einarbeitung in das Thema. Idealerweise genügt ihr als einziger Parameter das Ziel-Encoding. Das Original-Encoding steht ja bei der Erzeugung des Strings fest. Dessen Name ließe sich leicht merken und wiederverwenden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kapiere ich irgendwie immer noch nicht! Was soll denn Ziel der Operation sein?

Ein ``encode`` erzeugt doch schon Bytes in einem Zielencoding. Ein ``decode`` macht auf Strings in Python 3 doch gar keinen Sinn, da diese per se Unicode sind...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es geht darum, einen Python-String mit Encoding A in einen Python-String mit Encoding B umzuwandeln. Das ist ja auch Thema dieses Threads, oder nicht?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

snafu hat geschrieben:Es geht darum, einen Python-String mit Encoding A in einen Python-String mit Encoding B umzuwandeln. Das ist ja auch Thema dieses Threads, oder nicht?
Python3 hat aber keine "encodierten Strings" mehr. Es hat eben nur Unicode-Strings. Encodierte "Strings" - ähnlich zu den normalen Strings in Python 2 - sind Bytes! Umcodieren geht also immer so: Bytes →(decode)→ String →(encode)→ Bytes. Wenn bräuchtest Du eine Methode auf Bytes, die den Zwischenschritt in Strings "verschleiert", also in etwa so:

Code: Alles auswählen

def recode(bytes_, source, destination): 
    return bytes_.decode(source).encode(destination)

text = "Döner macht schöner‽"
# nehmen wir an, wie haben Daten in UTF-16:
origin = text.encode("utf16")

# die wollen wir in UTF-8 wandeln:
recode(ursprung, "utf16", "utf8")
> b'D\xc3\xb6ner macht sch\xc3\xb6ner\xe2\x80\xbd'
Ich sehe darin aber wenig "Vorteile", wenn Du musst die Encodings ja so oder so kennen ;-) Und vor allem: Wann arbeitest Du schon durchgängig mit Bytes? IdR. will man intern ja viel öfter mit Strings arbeiten und hat das Problem des unmittelbaren De- und Encodings ja gar nicht.

Viel sinnvoller wäre imho ein (optionaler) Parameter bei der ``print``-Methode zur Angabe des Zielencodings! Und natürlich ein fixes Default-Encoding, statt dieses System abhängigen Unsinns.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

OK, ich nehme meine Idee wieder zurück. Ich hatte nicht bedacht, dass die eigentliche Ausgabe ja auf Bytes erfolgt.
Antworten