UTF-8-Editor

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 22. Januar 2006, 21:40

Hi!

Unter Windows ist die Situation ziemlich schlimm. Es gibt kaum einen HTML-Editor oder sonst einen guten Programmier-Editor, der auch mit UTF-8 klar kommt.

Das hat mich so gestört, dass ich ein Helfer-Programm geschrieben habe. Dieses Programm konvertiert zuerst die zu editierende Datei in das Dateisystem-Encoding und ruft danach einen frei wählbaren Editor auf. Nachdem man den Editor geschlossen hat, wird die Datei wieder nach UTF-8 konvertiert.

Vorsicht! Auch wenn die Datei vorher nicht UTF-8 war -- nachher ist sie es sicher. :D

Und hier der Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
# file: utf8editor.py

import sys
import os
import os.path
import codecs

import win32ui
import win32con


EDITOR = r"C:\Programme\ConTEXT\ConTEXT.exe"


#------------------------------------------------------------------
def error_dialog(message):
    """
    Gibt eine Fehlermeldung aus.
    """
    
    win32ui.MessageBox(
        message, 
        "Fehler - " + sys.argv[0], 
        win32con.MB_OK + win32con.MB_ICONERROR + win32con.MB_SYSTEMMODAL
    )


#----------------------------------------------------------------------
def ansi2utf(filename):
    """
    Konvertiert von ANSI nach UTF-8
    """

    FROM_CODINGS = (
        "utf-8",
        sys.getfilesystemencoding(),
        "latin-1",
        "ascii",
        "cp1252",
    )
    TO_CODING = "utf-8"

    tmp_filename = "%s.tmp" % filename
    del_filename = "%s.del" % filename

    f_in = file(filename, "rb")
    f_out = codecs.open(
       tmp_filename,
       'wb',
       encoding = TO_CODING
    )
    s_in = f_in.read()
    f_in.close()
    
    for coding in FROM_CODINGS:
        try:
            s_out = s_in.decode(coding)
            break
        except:
            pass

    f_out.write(s_out)
    f_out.close()

    os.rename(filename, del_filename)
    os.rename(tmp_filename, filename)
    os.remove(del_filename)


#----------------------------------------------------------------------
def utf2ansi(filename):
    """
    Konvertiert die übergebene Datei von UTF-8 nach ANSI
    """

    FROM_CODINGS = (
        "utf-8",
        sys.getfilesystemencoding(),
        "latin-1",
        "ascii",
        "cp1252",
    )
    TO_CODING = sys.getfilesystemencoding()
    
    tmp_filename = "%s.tmp" % filename
    del_filename = "%s.del" % filename

    f_in = file(filename, "rb")
    f_out = codecs.open(
       tmp_filename,
       'wb',
       encoding = TO_CODING
    )
    s_in = f_in.read()
    f_in.close()
    
    for coding in FROM_CODINGS:
        try:
            s_out = s_in.decode(coding)
            break
        except:
            pass

    f_out.write(s_out)
    f_out.close()

    os.rename(filename, del_filename)
    os.rename(tmp_filename, filename)
    os.remove(del_filename)


#----------------------------------------------------------------------
def main():
    """
    Konvertiert die übergebene Datei nach ANSI und öffnet den
    Editor. Nachdem der Editor wieder geschlossen wurde, wird die
    Datei wieder nach UTF-8 konvertiert
    """

    import sys
    
    try:
        if len(sys.argv) == 2:
            filename = sys.argv[1]
    
            # Von UTF-8 nach ANSI konvertieren
            utf2ansi(filename)
            
            # Editor aufrufen
            #os.system(EDITOR + ' "' + os.path.abspath(filename) + '"')
            os.spawnl(os.P_WAIT, EDITOR, EDITOR + ' "' + os.path.abspath(filename) + '"')
            
            # Von ANSI nach UTF-8 konvertieren
            ansi2utf(filename)
            
        else:
            error_dialog(
                "Es muß ein Dateiname als Argument übergeben werden."
            )
    
    except Exception, inst:
        import traceback, sys
        tb = traceback.format_tb(sys.exc_traceback)
        message = "Folgender Fehler ist aufgetreten:\n\n"
        message += "Fehler: %s" % inst + "\n"
        message += "Startmodul: %s" % sys.argv[0].strip() + "\n"
        message += "Zeilennummer: %s" % traceback.tb_lineno(sys.exc_traceback) + "\n"
        message += "Dateiname: %s" % tb[0].split(",")[0].strip()[6:-1] + "\n\n"
        message += "Details:\n"
        for line in tb:
            message += "  " + line + "\n"
        error_dialog(message)


#----------------------------------------------------------------------
if __name__ == "__main__":
    main()
Jetzt muss man nur noch im "SendTo"-Ordner eine Verknüpfung anlegen, mit der das Programm aufgerufen wird.

Das Ziel der Verknüpfung könnte z.B. so aussehen:

Code: Alles auswählen

C:\Python24\pythonw.exe "P:\dev\utf8editor\utf8editor.py"
Der "SendTo"-Ordner befindet sich bei mir hier: C:\Dokumente und Einstellungen\Gerold\SendTo

Bei mir ist als Editor "ConTEXT" eingestellt. Natürlich kannst du jeden Editor deiner Wahl eintragen. Sobald die Verküpfung im "SendTo"-Ordner angelegt ist, kannst du jede Datei über das Kontextmenü an dieses Programm übergeben.

Hier noch ein Bild:

Bild

Ich gehe automatisch davon aus, dass jemand der unter Windows mit Python programmiert, die Erweiterung pywin32 installiert hat.

Somit kann jeder Editor auch als UTF-8-Editor verwendet werden. Du musst dir nur für jeden Editor ein Python-Skript mit geänderter "EDITOR"-Variable anlegen. Ja, ich weiß, das hätte man auch als Einstellung übergeben können. Ich war einfach zu faul dafür. :P

mfg
Gerold
:-)

Edit: Jetzt wird auch bei Verwendung von pythonw.exe eine aussagekräftige Fehlermeldung ausgegeben.
Zuletzt geändert von gerold am Sonntag 22. Januar 2006, 22:59, insgesamt 4-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sonntag 22. Januar 2006, 21:50

TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 22. Januar 2006, 22:12

blackbird hat geschrieben:Notepad++
Hi blackbird!

Danke für den Link, aber mir ging es hauptsächlich darum, Editoren zum Laufen zu bringen, die meist eine spezielle Aufgabe besonders gut können, aber mit UTF-8 nichts am Hut haben.

Solche Editoren, die ich gerne verwende aber nicht UTF-8 können sind z.B.:

http://www.weaverslave.ws/
http://www.chami.com/html-kit/
http://www.bradsoft.com/topstyle/index.asp
http://www.context.cx/

Wobei Context aus der Rolle fällt, da er einfach nur ein normaler Editor ist, den ich aber sehr lieb gewonnen habe.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten