Aufgrund der erneuten Nachfrage von Klops und dem Umstand, dass ich mich mit dem Encoding-Thema gerade beschäftigt habe, will ich meine
Antwort etwas erweitern. Die Ursache des Problems liegt zum einen im intern verwendetem Encoding der Schilder-Texte (cp1252) und dem Mix
der String-Typen bei der Interaktion mit den „Signs“. Eine Ungenauigkeit beim Design der Civ4-Schnittstellen.
Zuerst einmal zur Eingabe der Sign-Texte. Dafür gibt es folgende Funktion
Code:
Python Library Documentation: method addSign
addSign(...) method of CvPythonExtensions.CyEngine instance
void (CyPlot *plot, int /* PlayerTypes */ playerType, const TCHAR* caption)
Um die richtige Kodierung zu wählen, muss man utf-8-Texte folgendermaßen in cp1252 konvertieren:
Code:
CyEngine().addSign(gc.getMap().plot(0,4), -1, "ü".decode('utf-8').encode('cp1252'))
None # <- Rückgabe wert zeigt, dass es geklappt hat
# Nicht gehen würde
CyEngine().addSign(gc.getMap().plot(0,4), -1, "ü".encode('cp1252'))
# weil "ü" in der Regel in einer Python-Datei mit utf-8-Kodierung gespeichert ist(?!)
# Im Spiel gilt aber standardmäßig…
print(sys.getdefaultencoding())
ascii
Nun zum Auslesen der Schilder. Dafür gibt es in CyEnigne…
Code:
getNumSigns(...) unbound CvPythonExtensions.CyEngine method
int getNumSigns()
getSignByIndex(...) unbound CvPythonExtensions.CyEngine method
CySign* (int index)
Und dann CySign:
Code:
Python Library Documentation: CySign in module CvPythonExtensions object
class CySign(Boost.Python.instance)
| Method resolution order:
| CySign
| Boost.Python.instance
| __builtin__.object
|
| Methods defined here:
|
| __init__(...)
|
| getCaption(...)
| wstring getCaption()
|
| getPlayerType(...)
| PlayerTypes getPlayerType()
|
| getPlot(...)
| CyPlot getPlot()
|
D.h. die Rückgabe ist ein Unicode-String. Beispiel-Anwedung:
Code:
sign = CyEngine().getSignByIndex(0) # Hier muss man ggf. den richtigen Index suchen
print(sign.getCaption().encode('utf-8'))
TLDR: Rein müssen Strings mit cp1252-Kodierung, aber raus fallen Unicode-Strings. Ich werde den WB in der PB Mod
so anpassen, dass die in Civ4 erlaubten Sonderzeichen/Umlaute keine Probleme mehr bereiten.
Edit: Patch von CvWBDesc.py ist
Code:
CvWBDesc.py
@@ -1997,7 +1997,7 @@ class CvSignDesc:
f.write("\tplotX=%d\n" %(sign.getPlot().getX(),))
f.write("\tplotY=%d\n" %(sign.getPlot().getY(),))
f.write("\tplayerType=%d\n" %(sign.getPlayerType(),))
- f.write("\tcaption=%s\n" %(sign.getCaption(),))
+ f.write("\tcaption=%s\n" %(sign.getCaption().encode('utf-8'),))
f.write("EndSign\n")
def read(self, f):
@@ -2030,7 +2030,7 @@ class CvSignDesc:
v = parser.findTokenValue(toks, "caption")
if v!=-1:
- self.szCaption = v
+ self.szCaption = v.decode('utf-8').encode('cp1252')
continue