Das Problem beim Übergeben von Texten an die Konsole ist, dass das Coding der Konsole nicht unbedingt mit dem im Skript verwendeten Coding überein stimmen muss. Mir ist aufgefallen, dass die Python-Programm unter Linux meist mit dem gleichen Coding erstellt werden, mit dem auch die Konsole läuft. Das ist aber unter Windows ziemlich selten der Fall.
Um beim Schreiben in die Konsole auch das richtige Coding zu verwenden, muss man vorher herausfinden welches Coding verwendet werden soll. Das funktioniert mit dem Befehl sys.stdout.encoding. Es kann vorkommen, besonders wenn man das Skript aus einer IDE heraus aufruft, dass dieser Befehl nichts zurück gibt. Dann kann man es ja noch mit sys.getfilesystemcoding() versuchen.
Leider ist es unter Python nicht so einfach einen Text in ein bestimmtes Coding umzuwandeln. Man muss immer vorher den Text, vom im Skript verwendeten Coding, nach Unicode umwandeln. Erst danach kann man den Unicode-String in das gewünschte Ziel-Coding umwandeln.
Zum Umwandeln nach Unicode kann man die String-Methode decode() verwenden. Zum Umwandeln von Unicode in das gewünschte Ziel-Coding kann man die Methode encode() verwenden.
Also, noch einmal, weil es so wichtig ist: Mit decode() wird ein Text nach Unicode umgewandelt und mit encode() wird dieser Unicode-String in das gewünschte Ziel-Coding umgewandelt.
Jetzt müssen wir nur noch herausfinden, von welchem Coding wir den Text in den Unicode-String umwandeln müssen. Das mache ich mir persönlich ziemlich einfach. Ich habe meistens in meinen Python-Modulen eine Variable mit dem Namen SCRIPTCODING, die ich auf das Coding meines Skriptes setze. Man muss nur darauf achten, dass man diese Variable beim Ändern des Script-Codings auch verändert.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import sys
SCRIPTCODING = "iso-8859-1"
FSCODING = sys.stdout.encoding or sys.getfilesystemencoding()
Und so könnte das komplette Skript aussehen:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import sys
import types
SCRIPTCODING = "iso-8859-1"
FSCODING = sys.stdout.encoding or sys.getfilesystemencoding()
#----------------------------------------------------------------------
def to_fscoding(text = ""):
"""
Wandelt Text vom Coding des Skriptes in das
Kommandozeilen-Coding um.
"""
if isinstance(text, types.StringTypes):
if text:
try:
text = text.decode(SCRIPTCODING)
text = text.encode(FSCODING)
except:
pass
return text
#----------------------------------------------------------------------
def to_scriptcoding(text = ""):
"""
Wandelt Text vom Coding der Kommandozeile in das
Script-Coding um.
"""
if isinstance(text, types.StringTypes):
if text:
try:
text = text.decode(FSCODING)
text = text.encode(SCRIPTCODING)
except:
pass
return text
#----------------------------------------------------------------------
def pnt(message = ""):
"""
Helferprozedur um den Befehl zum Schreiben
in die Konsole ein wenig abzukürzen.
Aus ``print to_fscoding(message)`` wird ``pnt(message)``.
"""
print to_fscoding(message)
#----------------------------------------------------------------------
def main():
"""Hauptprozedur"""
# Im Skript definierter Text
message = "Das ist ein Text mit Umlauten (öäüß)"
pnt(message)
# Zahl
message = 12345
pnt(message)
# Von der Kommandozeile entgegen genommener Text
if len(sys.argv) > 1:
message = to_scriptcoding(sys.argv[1])
pnt(message)
#----------------------------------------------------------------------
if __name__ == "__main__":
main()
Weiterhin viel Spaß beim Programmieren mit Python!