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.
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()
Das Ziel der Verknüpfung könnte z.B. so aussehen:
Code: Alles auswählen
C:\Python24\pythonw.exe "P:\dev\utf8editor\utf8editor.py"
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:
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.
mfg
Gerold
Edit: Jetzt wird auch bei Verwendung von pythonw.exe eine aussagekräftige Fehlermeldung ausgegeben.