Hallo BlackJack,
BlackJack hat geschrieben:@HarryH: Du solltest Dich mal umfassend über Kodierungen informieren. Das was Du vorhast, alle Quelltexte nach UTF-8 kodieren, um vielleicht Probleme zu beheben die Du nicht nachvollziehen kannst, ist keine Lösung sondern Voodoo.
Das sollte ich wirklich (mich informieren) und ich bin gerade dabei.
BlackJack hat geschrieben:Wenn Du Dich schon mit Unicode auseinandersetzt, dann sollte die "interne" Kodierung gar keine sein, sondern es sollten soweit es möglich ist Unicode-Zeichenketten verwendet werden und nur an den "Ein-" und "Ausgängen" entsprechende Kodierungen vorgenommen werden.
Was meinst du hier mit 'interne' Codierung? Ich meinte damit den speziellen Kommentar in der ersten Zeile der Datei.
Unicode-Zeichenketten werden mit 'u' vor dem String bezeichnet, oder?
Habe ich das richtig verstanden, der spezielle Kommentar gilt nur für die Zeichen die ich in meinen Quelltext schreibe?
Woher weiß ich eigentlich in welcher Codierung mein Editor speichert?
BlackJack hat geschrieben:Man kann auch nicht viel sagen, wenn Du einfach nur sagst, "dann tauchten Probleme auf". Wenn die durch eine andere Kodierung gelöst werden konnten, bedeutet das wohl, dass die Unicode-Zeichenkette aus der Registry, Zeichen enthielt, die in "iso-8859-1" nicht enthalten sind. Das ist einer Gründe warum man innerhalb eines Programms bei Unicode bleiben und ausserhalb versuchen sollte eine Kodierung wie UTF-8 oder UTF-16 zu verwenden. Dann können nämlich alle Zeichen verarbeitet und gespeichert werden.
Du hast recht. Hier sind meine zwei Funktionen zum Lesen, bzw. Schreiben in die registry.
Code: Alles auswählen
def SetRegistryEntrys(self, folder, entrys):
path = "%s\%s" % (self.winregPath, folder)
key = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, path)
i = -1
for i, entry in enumerate(entrys):
name = "%02i" % i
_winreg.SetValueEx(key, name, 0, _winreg.REG_SZ, entry)
#Lösche überflüssige entrys
while 1:
i += 1
try:
name = "%02i" % i
_winreg.DeleteValue(key, name)
except EnvironmentError:
break
key.Close()
def GetRegistryEntrys(self, folder, testExistence=False):
path = "%s\%s" % (self.winregPath, folder)
key = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, path)
c = 0
entrys = []
while 1:
try:
name, entry, v_type = _winreg.EnumValue(key, c)
entry = entry.encode("iso-8859-1")
if testExistence:
if os.path.exists(entry):
entrys.append(entry)
else:
entrys.append(entry)
c += 1
except EnvironmentError:
break
key.Close()
return entrys
Mit SetRegistryEntrys() schreibe ich Pfade in die registry. Mit GetRegistryEntrys() lese ich diese Pfade wieder. Da sie mir dabei als unicode strings zurückgegeben werden, konvertiere ich in momentan mein internes Encoding.
Bei manchen Zeichen erscheint dann folgender Fehler:
Code: Alles auswählen
File "PathDialog.py", line 1268, in GetRegistryEntrys
entry = entry.encode("iso-8859-1")
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 78: ordinal not in range(256)
Verwende ich anstatt "iso-8859-1" sys.getfilesystemencoding() funktioniert es. Wenn aber ich in meinem Programm nur mit Unicode arbeite, müßte ich nichts codieren, oder?
BlackJack hat geschrieben:Welche Kodierung der Quelltext hat ist egal solange: a) der coding-Kommentar mit der tatsächlichen Kodierung übereinstimmt und man b) keine Zeichen ausserhalb von ASCII in normalen Zeichenketten verwendet. Der coding-Kommentar sagt Python "nur" welche Kodierung zum dekodieren von literalen Unicode-Zeichenketten im Quelltext verwendet werden soll.
Wenn ich folgendes "Programm" ausführe:
erhalte ich die Meldung:
Code: Alles auswählen
Traceback (most recent call last):
File "test.py", line 3, in <module>
print u"äöüß"
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
Ich frage mich warum, wenn die Zeichen doch in UTF-8 enthalten seien sollten?
Als Editor verwende ich übrigens "Scite". Kann es auch daran liegen? Wie finde ich heraus in welchen Encoding die Datei vom Editor abgespeichert wird? Welche Rolle spielt der Editor bei der ganzen Encoding-Geschichte?
Ich weiß: viele, viele Fragen, manche vielleicht auch überflüssig, aber das weiß man als Fragesteller auch meist nur nach der Antwort.
Deswegen schon mal vielen Dank für die Mühe!
@Jens: Ich bin gerade dabei deinen Link durchzuforsten. Danke!