halvar.at bcom Python Tools Plone Zope Visual Basic Programmierung SW3 PC Computer Netzwerk Linux Windows Shop

Skip to content

Gerolds Homepage

Sections
Personal tools
You are here: Home Python Python Anleitungen Umlaute und die Kommandozeile
Document Actions

Umlaute und die Kommandozeile

Schreiben von Umlauten in die Konsole -- Lesen von Umlauten aus der Kommandozeile

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

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys

SCRIPTCODING = "iso-8859-1"
FSCODING = sys.stdout.encoding or sys.getfilesystemencoding()

Noch ein wichtiger Hinweis! Wenn man das Coding am Anfang des Moduls mit # -*- coding: definiert, dann muss man dieses Coding auch verwenden. Wenn man dem Python-Interpreter mit # -*- coding: utf-8 -*- mitteilt, dass das Skript als UTF-8-Datei abgespeichert wurde, dann muss man sich auch daran halten und die Datei auch wirklich als UTF-8-Datei abspeichern. Der Editor Wing-IDE liest das definierte Coding aus und speichert die Datei automatisch in diesem Format ab. Das ist bei anderen Editoren nicht selbstverständlich und viele können mit UTF-8 überhaupt nicht umgehen. Um unter Windows zu prüfen, in welchem Coding ein Python-Modul abgespeichert wurde, kann man dieses im Editor "Notepad", dem Standardeditor von Windows öffnen. Wenn man dann im Menü Datei auf Speichern unter... klickt, dann sieht man, mit welchem Coding der Editor dieses Skript abspeichern würde. Bei UTF-8-Dateien wird im Speichern-Dialog UTF-8 angezeigt.

Und so könnte das komplette Skript aussehen:

#!/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!

 

Powered by Plone   Powered by Bcom   Powered by Gentoo-Linux

Diese Seite erfüllt evt. :-) folgende Standards: