Seite 1 von 2

Problem mit Umlauten bei input()

Verfasst: Samstag 13. September 2014, 21:54
von Kukuschi
Hallo,

ich bin blutiger Anfänger. Bitte habt etwas Nachsicht, wenn meine Frage allzu dämlich ist.
Nachdem ich den halben Nachmittag vergeblich damit verbracht habe, eine Lösung für das Problem zu ergooglen wende ich mich nun an Euch und hoffe auf Erleuchtung.

Ich benutze Python 3.4.1 in Visual Studio Express 2013 für Windows Desktop.
Unter "erweiterte Speicherfunktionen" ist Unicode (UTF-8 mit Signatur) eingestellt (ein Versuch mit UTF-8 ohne Signatur endet mit dem gleichen Ergebnis). UTF-8, weil mein erstes größeres Projekt eine Japanische Lernhilfe werden soll, ich also Deutsche und Japansiche Schriftzeichen brauche.
Hier handelt es sich aber erstmal um ein Programm aus einem Buch.

Im gesamten Programm werden alle Umlaute und auch ß korrekt ausgegeben, lediglich in der Zeile:

Code: Alles auswählen

guess = int(input("Schätzen Sie: "))

stellt er das ä nicht korrekt dar sondern als
Bild

Hier das gesamte programm:

Code: Alles auswählen

secret = 1337
guess = 0
i=0

while guess != secret:
    guess = int(input("Schätzen Sie: "))
    
    if guess < secret:
        print ("Zu klein")

    if guess > secret:
        print ("Zu groß")

    i = i + 1
print ("Sie haben es in ", i, "Versuchen geschafft!")

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 13. September 2014, 22:06
von BlackJack
@Kukuschi: Das sieht so aus als wenn das Programm den Text UTF8-kodiert raus schreibt, das Terminal aber cp850 (oder etwas ähnliches) erwartet. Zeichenkodierungen sind ein spassiges Thema. :-) Man kommt letztendlich nicht drumherum seine Texte immer explizit zu (de)kodieren und Benutzer des Programms die Möglichkeit zu geben eine Kodierung, zum Beispiel als Kommandozeilenoption, zu übergeben.

Edit:

Code: Alles auswählen

In [41]: print u'Schätzen Sie: '.encode('utf8').decode('cp850')
Schätzen Sie:

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 13. September 2014, 22:15
von Kukuschi
Ja, wie Spaßig das Thema ist habe ich nach einem halben Nachmittag Googlen und einem mächtig rauchendem Kopf bemerkt. :lol:

Die Vermutung, dass das Terminal cp850 erwartet hatte ich auch erst (gemäß einiger Funde im Internet), aber dann würden doch die anderen Umlaute und das ß auch nicht korrekt dargestellt, oder? Es ist wie gesagt nur bei dieser Eingabezeile. Ich steh auf dem Schlauch. :K

Das dekodieren und enkodieren scheint trotzdem eines der ersten Themen zu sein, denen ich mich dann wohl etwas ausführlicher widmen muss :?.

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 13. September 2014, 22:23
von BlackJack
@Kukuschi: Startest Du das aus der IDE heraus? Kann es sein das die da reinpfuscht?

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 13. September 2014, 22:40
von Kukuschi
Ja, es scheint fast so. Wenn ich das Programm ohne Visual Studio in der Python Shell ausführe wird es korrekt dargestellt.
Wenn ich das Programm im Windows Explorer per "Rechtsklick --> öffnen mit --> Python Launcher for Windows (Console)" (alternativ doppelklick) öffne, erscheint das gleiche Fenster wie beim starten aus Visual Studio heraus und mit dem gleichen Darstellungsfehler. Kapieren tue ich das trotzdem nicht so recht, warum er an dieser Stelle Umlaute verhunzt wenn er sie im gesamten restlichen Programm ohne zu murren darstellt.
Sollte ich mich lieber in einem Visual Studio Forum anmelden? :?

Edit: :idea: Oder ich benutze ne andere IDE :idea: 8) *Eclipse lädt*

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 14. September 2014, 15:24
von Hellstorm
Kukuschi hat geschrieben: Edit: :idea: Oder ich benutze ne andere IDE :idea: 8) *Eclipse lädt*
Ich finde PyCharm auch ganz gut.

Du wirst aber nachher wahrscheinlich vor einem anderen Problem mit Japanisch stoßen. Und zwar hat die Windows-Konsole nur cp850, wo Japanisch aber nicht enthalten ist.

Python ist intelligent genug zu merken, was die Konsole für eine Kodierung hat und kodiert das dann entsprechend um. Das heißt, dass wenn du in deinem Quelltext ein „ä“ in UTF-8 schreibst, Python dann automatisch bei einer Windows-Konsole das ä in cp850 ausgibt. Unter Linux würde das dann in UTF-8 ausgegeben.

Das ist für Deutsch kein Problem und klappt auch sehr gut, so dass man bei Python eigentlich nur sehr wenige Zeichensatzprobleme hat. Aber wenn der Zeichensatz eben manche Zeichen nicht unterstützt, kann Python das auch nicht umwandeln. cp850unterstützt nämlich kein Japanisch, und dann bekommst du einen lustigen UnicodeEncodeError.

Speicher mal

Code: Alles auswählen

print("日本語")
in einer Datei und führ die aus.

Code: Alles auswählen

PS D:\> python test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    print("\u65e5\u672c\u8a9e")
  File "C:\Programmieren\Python33\lib\encodings\cp850.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
Du kannst da dann versuchen, die Kodierung der Windows-Konsole umzustellen, aber dann brauchst du immer noch eine andere Schriftart. Ich finde das unglaublich nervig. Für Windows ist wahrscheinlich eine GUI besser.
Unter Linux würde das ohne Probleme funktionieren. Und unter einem japanischen Windows würde das auch funktionieren, allerdings funktionieren dort dann keine Umlaute :D

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 14. September 2014, 17:24
von Kukuschi
Da ich früher oder später sowieso ein GUI haben will schadet es wohl nichts gleich damit zu arbeiten. Da reicht erstmal ja was einfaches.

Danke für Eure schnelle Hilfe :)

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 20. September 2014, 12:49
von Kukuschi
Kurzer Nachtrag:

Ich benutze nun PyCharm und bin recht angetan. Auch ohne GUI in Windows (8.1) keine probleme mit Umlauten und japanischen Schriftzeichen bisher. (Eclipse habe ich nicht probiert).

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 20. September 2014, 13:19
von BlackJack
@Kukuschi: Was meinst Du mit „ohne GUI”? Du hast keine Probleme mit japanischen Schriftzeichen wenn Du ein Programm ohne die IDE, die ja ein *GUI-Programm* ist, startest?

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 20. September 2014, 13:30
von Hyperion
Zum Thema Encoding kannst Du auch gerne mal einen Blick in meine Signatur werfen :-)

(Das Thema war iirc der Grund, wieso ich mich hier einst angemeldet habe :-) )

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 20. September 2014, 14:00
von Kukuschi
Ich bin absoluter Anfänger und werfe dadurch vermutliches alles möglich über einen Haufen :oops: .
Was ich meinte ist, dass ich ohne Schwierigkeiten/Darstellungsfehlern in PyCharm Programme laufen lassen kann, in denenen Umlaute und japanische Schriftzeichen vorkommen. Ich muss nicht erst für das Programm eine GUI programmieren (mit TkInter o.ä.), um die Windowskonsole zu umgehen. Das entlastet mich als Anfänger und ich kann das entwickeln einer GUI für meine japanisch-Lernsoftware aufschieben, bis ich besser in Python bin.

Wenn das, was ich sage totaler Blödsinn ist und ich diverse Denkfehler mache (wovon ich ausgehe ^^) rettet mich ehe ich mich weiter blamieren :lol:
Ich lerne ich immer gerne dazu. :)

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 20. September 2014, 14:36
von BlackJack
@Kukuschi: Das Problem dabei ist halt das man im Zweifelsfall PyCharm benötigt um diese Programme laufen zu lassen, weil die ausserhalb der IDE sehr wahrscheinlich nicht so problemlos laufen.

Re: Problem mit Umlauten bei input()

Verfasst: Samstag 20. September 2014, 15:22
von Kukuschi
Ja, das is klar, aber ich kann immerhin das Problem weiter nach hinten verschieben und erstmal weiter die Grundlagen lernen an meinem Wunschlernprojekt und dann zu gegebener Zeit tiefer in encoding und GUI programmierung etc. einsteigen.

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 21. September 2014, 10:46
von Hyperion
Allgemein kann man Encodings aber auch verstehen, wenn man keinen Deut programmieren kann. Im sehr guten Blog-Eintrag aus meiner Signatur kommt iirc nicht eine Zeile Programmcode vor. Da werden lediglich die Konzepte erklärt :-)

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 21. September 2014, 11:11
von Kukuschi
Ist schon in meinen Lesezeichen gespeichert. Sobald ich etwas Zeit finde werde ich mir das mal zu Gemüte führen. :)

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 21. September 2014, 11:31
von snafu
Ich frage mich, wieso Python-3-Strings keine ``.to_encoding()``-Methode haben. Das würde solche Aufgaben besonders für Anfänger erleichtern.

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 21. September 2014, 11:56
von Hyperion
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?

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 21. September 2014, 12:18
von snafu
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.

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 21. September 2014, 12:26
von Hyperion
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...

Re: Problem mit Umlauten bei input()

Verfasst: Sonntag 21. September 2014, 12:44
von snafu
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?