Anfänger-Frage: 1.Stunde Python - erstes Problem

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.
Antworten
Benutzeravatar
danever
User
Beiträge: 6
Registriert: Freitag 6. April 2018, 22:03

Hallo liebe Python Community:

Ich arbeite gerade "Learn Python the hard way" durch. In der 2ten Übung geht es um den Print Befehl.

Im Notepad++ habe ich folgenden Code stehen:
------------

Code: Alles auswählen

#- *- coding: utf- 8 - *-"
print "scharfes es,ß " #das macht er aber nicht richtig der sauprolet der unnedige
print "umlaut a, ä"
print "umlaut o, ö"
print "umlaut u, ü"
print "§"
------- das file ist im Editor Notepad++ unter "Encoding" als "Encode in UF8 bezeichnet.------

Ergebnis (Win10 - Python 2.7.14) in der Powershell ist folgendes:

scharfes es,ß
umlaut a, ä
umlaut o, ö
umlaut u, ü
§

---------------
Ich bin mir sicher ihr wisst wo da der Hase im Pfeffer liegt... danke im vorraus... Bitte die Antwort in Worte fassen die mit meinem noch 0-Wissen interpretierbar sind. :roll:
Astorek
User
Beiträge: 72
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

Ist Python 2 unbedingt noch erforderlich? Der Support für den 2er-Zweig von Python soll ja voraussichtlich 2020 eingestellt werden... (ursprünglich sogar schon 2015, wurde aber um 5 Jahre verlängert...) "Learning Python the hard way" gibt es auch für Python 3, leider sind Quelltexte zwischen Python 2 und 3 nicht unbedingt kompatibel zueinander...

Ich kenne mich nicht wirklich mit Encodings aus, hatte mir zu Python2-Zeiten aber angewöhnt, ein vorangestelltes "u" zu nutzen, quasi:

Code: Alles auswählen

print u"ä"
Ob das aber die empfohlene Herangehensweise ist, weiß ich nicht^^.

Hier im Python-Forum hat sich einer vor einiger Zeit mal die Mühe gemacht und die Encoding-Geschichten etwas detaillierter zusammengefasst. Dürfte für Interessierte sicher einige Fragen beantworten: viewtopic.php?t=5095
Benutzeravatar
danever
User
Beiträge: 6
Registriert: Freitag 6. April 2018, 22:03

Hallo Astorek,
Danke für deine Nachricht... leider hat es nicht geholfen :?

Code: Alles auswählen

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

Ja, bezüglich der Frage 2.7 oder 3.5 habe ich ein paar Artikel gelesen und ich weiss über den Umstand/Misstand ... aber da ich das eher als Spass mache, probier ich mal das eine und dann wechsele zum anderen, weil ich denke in a long run sollte man von beiden eine Ahnung haben. :wink:

Den Artikel über die Encodings hatte ich schon gefunden ...aber nicht verstanden... :shock:
dennoch danke für deine Hilfe... lg
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Ich denke das Schätzt du falsch ein. Meiner Meinung nach muss man nicht von beiden Versionen eine Ahnung haben. Py3 alleine reicht. Und das es eine Weiterentwicklung gibt, hat ja seine Gründe.
Ich selbst bin vor nicht allzu langer Zeit in Python eingestiegen. Habe mich aber auf Py3 konzentriert. Wenn man dann ein paar Py2 Geschichten mit bekommt, ist das Nice2Know. Nicht anders herum. Oder beschäftigts du dich auch mit Win95 und Unix Os2?
Py3 hat strings default auf UTF8. :D
Findest du hier eine Antwort?
viewtopic.php?t=34530
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Windows benutzt ein eigenes Encoding für die Shell, du musst den Text encodieren damit die Umlaute richtig ausgegeben werden.
Bei Python 3 ist das so nicht mehr notwendig.
Willst du wirklich dabei bleiben, schau dir mal decode, encode und sys.stdin.encoding an.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

So kriegt man mit einem Python-2.7.-Skript den Umlaut in der PowerShell korrekt dargestellt:

Code: Alles auswählen

# -*- coding: utf-8 -*-
print u'ä'
Wenn man nicht jedes Mal das u davorschreiben will, dann kann man einen speziellen Import nutzen:

Code: Alles auswählen

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

print "scharfes es,ß " #das macht er aber nicht richtig der sauprolet der unnedige
print "umlaut a, ä"
print "umlaut o, ö"
print "umlaut u, ü"
print "§"
Damit wird aus jedem 'text' ein u'text'.
Benutzeravatar
danever
User
Beiträge: 6
Registriert: Freitag 6. April 2018, 22:03

Ha! gelungen..

Code: Alles auswählen

# -*- coding: utf-8 -*-
print "aä"
das im Editplus (und nicht mehr den Notespad++!!!!) als ANSI gespeichert liefert mir



:K - keine Ahnung warum man das File als Ansi speichern muss aber naja... Danke euch allen...
Benutzeravatar
danever
User
Beiträge: 6
Registriert: Freitag 6. April 2018, 22:03

Nachtrag: - auch im Notespad++ gehts - wenn man es als Ansi file deklariert. und im code
# -*- coding: utf-8 -*- reinschreibt. Danke an alle...
Benutzeravatar
DeaD_EyE
User
Beiträge: 1020
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Spätestens, wenn du sowas machen willst, wirst du auf Python 3 wechseln:

Bild
Wird erst ab Python 3.7+ unterstützt. Viele neue Emoticons sind in Unidoce 10.0 Standard hinzugekommen.
Leider nicht der Vomit Modifier. Es wäre echt super gewesen auch kotzende Buchstaben durch Komposition zu erstellen.

Code: Alles auswählen

Python Version                                         | Unicode Version
Python 2.7.14 (default, Jan  5 2018, 10:41:29)         | 5.2.0
Python 3.6.4 (default, Jan  5 2018, 02:35:40)          | 9.0.0
Python 3.7.0b2 (default, Apr  2 2018, 11:06:37)        | 10.0.0
Wer auf eine aktuelle Python-Version wechseln möchte und noch Windows XP Nutzer ist, sollte zuerst das Betriebssystem gegen ein neueres austauschen.
Seit der Python Version 3.5 wurde der Support für Windows XP eingestellt.

Ich habe damals auch gedacht, dass ich erst mit Python 2.7 anfangen müsse.
Irgendwann war ich doch mal neugierig und habe zum ersten mal gemerkt, dass der Werkzeugkasten viel größer ist und aufgeräumt wurde.
Wahr ist aber auch, dass sich der Sprachumfang wirklich stark erweitert hat. Es gibt jetzt nicht nur die Welt der synchronen Programmierung (Anweisung nach Anweisung) in Python, Asynchron ist hinzugekommen und eine völlig andere Welt.
Aber das kann man ja erst mal auslassen. Man lernt es, wenn man es braucht.

Coole Emoticons braucht aber jeder :mrgreen:
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@danever: ja, Windows lebt mit seiner Konsole noch im letzten Jahrtausend. Daher ist das Ausgabeencoding eine Katastrophe. Das wurde erst mit Python 3.6 einigermaßen in Ordnung gebracht. Daher empfiehlt es sich Python 3.6 mit Windows zu benutzen.

Wenn Du das Encoding umstellst, dann solltest Du auch die erste Zeile richtig schreiben, für ANSI ist das iso-8859-1:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
print "aä"
Benutzeravatar
danever
User
Beiträge: 6
Registriert: Freitag 6. April 2018, 22:03

Sirius3 hat geschrieben:@danever:
Wenn Du das Encoding umstellst, dann solltest Du auch die erste Zeile richtig schreiben, für ANSI ist das iso-8859-1:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
print "aä"
Cool - ich habs gemacht... funktioniert auch.
Kann man mir erklären was hier genau passiert? Wie erklärt sich das Problem und wie seine Lösung? Ich habe zwar jetzt eine funktionsfähige Lösung aber würde gerne verstehen "warum"?
Meine Hypothese: Python 2.x nimmt von haus aus an, es kommen ANSI Characters und versteht nur solche. Will man andere durch den Interpreter jagen braucht es eben das Ausweisen des codes... hier iso-8859-1. Ist diese Annahme soweit richtig?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@danever: in Python gibt es den Unterschied zwischen Bytestrings und Unicodestrings. Bytestrings sind einfach nur Bytes, denen ist es egal, um was für ein Encoding es sich handelt. Und so wird halt das, was da an Bytes kommt in der Windowskonsole ausgegeben, die auch nur Bytes kennt und diese mit einem ANSI-Zeichensatz (das ist ISO-8859-1) ausgibt. Unicode kodiert Zeichen und da Windows keine Zeichen kennt, muß man sie wieder in Bytes umwandeln und da hakt es eben. So wie Du es machst, ist es unsauber, aber das ist so einiges an Windows.
Benutzeravatar
danever
User
Beiträge: 6
Registriert: Freitag 6. April 2018, 22:03

danke für deine Erklärung!
Antworten