Worauf das Projekt eingestellt ist, ist hierfür quasi egal. Das ist nur Microsoft-Unterscheidung, ob es Zeichenketten als wchar_t (16Bit pro Zeichen) oder als char (8 Bit pro Code Point) ablegt. Man beachte den Wechsel von "Zeichen" zu "Code Point", das ist ein Unterschied. Diese Einstellung unterscheidet auch, ob jeweils die W oder die A-Variante eines OS-Aufrufs verwendet wird, aber mehr auch nicht.
Encodings in Kurzform: es gibt um die 110 Tausend definierte Schriftzeichen. Siehe
http://de.wikipedia.org/wiki/Unicode Bei der Anzahl wird klar, dass die nicht in 8Bit reinpassen, auch nicht in 16Bit. Daher gibt es viele verschiedene Encodings, die besagen, welche Zeichen auf welchem Zahlenwert rauskommen. Die meisten dieser Encodings selektieren dabei sehr stark, ein Großteil der Zeichen kann gar nicht dargestellt werden.
Uralt: Ansi-Code. Enthält nur die Zeichen bis 32-127, also die klassische englische Sichtweise auf die Welt mit 26 großen und kleinen Buchstaben, Zahlen und einigen Satzzeichen.
Dann gibt es viele erweiterte Encodings, die auch nur ein Byte pro Zeichen haben und die oberen 128 Werte für alle möglichen Sonderzeichen benutzen. Standard in Mitteleuropa ist da z.B.
http://en.wikipedia.org/wiki/Windows-1252, aber da sieht man bereits, dass damit in z.B. Russland nix mehr zu machen ist.
UTF8 ist ein Encoding, dass ebenso das in ANSI ungenutzte 8. Bit ausnutzt. Nur wird bei UTF8 (vereinfacht ausgedrückt) damit signalisiert, dass ein Zeichen aus mehr als einem Byte besteht. Das ist ein ziemlich cooler Trick, mit dem man einige Millionen Zeichen abbilden kann, aber ein Text wie normales ANSI aussieht, solange er kein Sonderzeichen verwendet. Also quasi eine clevere Art der Abwärtskompatibilität. Das hat auch den Vorteil, dass für ein Programm quasi alle Stringoperationen erstmal wie vorher funktionieren - Suche in Strings, Verketten usw. gehen stressfrei. Nur dass jetzt die Byte-Größe eines Strings nicht mehr besagt, wieviele Zeichen in dem String sind - es können auch weniger Zeichen sein, wenn Zeichen aus mehreren Bytes zusammengesetzt sind.
Der Nachteil ist, dass Du nicht mehr Byte für Byte durch einen String durchgehen kannst und irgendwelche Operationen auf den einzelnen Zeichen ausführen kannst. Das betrifft Dich z.B., wenn Du Deinen Text selbst renderst. Es gibt minimal großen Code, der das Lesen und Schreiben von UTF8-Zeichen übernimmt, aber Du kannst das auch selbst schreiben, wenn Du willst.
Wenn Du in Deinem XML ein "Ö" siehst, bedeutet das folgendes:
- in der XML-Datei steht ein Ö in einem der alten 8Bit-Encodings, also z.B. ein Einzelbyte 214 im Encoding Windows 1252. Wer auch immer Dir den Text anzeigt, hat beim Lesen erraten, dass es Windows1252 ist, und der Zahl 214 das Zeichen "Ö" zugeordnet. Ein russisches Windows z.B. würde wahrscheinlich anders raten, eine andere Codepage auswählen und Dir wahrscheinlich einen russischen Buchstaben stattdessen anzeigen.
- in der XML-Datei steht ein Ö als UTF8, also zwei Bytes mit den Werten, die Du selbst bemerkt hast. Die zumeist automatischen Detektionsalgorithmen erkennen UTF8-Bytefolgen meist recht zuverlässig. Da UTF8 alle Zeichen abbilden kann, gibt es hier keine Codepage, sondern die resultierenden Zahlenwerte können direkt einem Unicode-Zeichen zugeordnet werden. Das funktioniert zuverlässig weltweit, weswegen UTF8 für viele Protokolle und Systeme auf dieser Welt Standard ist.
Wenn Dir wxWidgets ein sauberes Ö dafür anzeigt, dann hat wxWidgets zuverlässig die UTF8-Bytes gelesen und kann sicher Zeichen dazu anzeigen. Andere Programme wie z.B. der Visual Studio-Debugger zeigen erstmal direkt die Einzelbytes an, aber Du kannst sie zumeist auch dazu überreden, es mal mit UTF8 zu versuchen. Dein eigener Code dagegen... das musst Du allein machen. In den meisten Fällen braucht man keine Einzelzeichen und kann UTF8-Strings einfach durchziehen, wie man mag. Bei Einzelzeichen-Verarbeitung wie Tastatureingabe oder eigenem Font Rendering dagegen muss man die UTF8-Dekodierung selber machen.
Alternativ kannst Du auch den Microsoft-bevorzugten Standard UTF16 nehmen. Da werden halt 16Bit-Integer anstatt 8Bit-Integer verwendet, weswegen man nur noch ein oder zwei dieser Code Points verketten muss, um den kompletten Unicode-Zeichensatz abbilden zu können. Das fressen dann alle "W"-Windows-Funktionen, aber dafür musst Du halt UTF8-Strings konvertieren.