Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge
Verfasst: 07.04.2016 17:32
Ich geb es auf 
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
PB-Hilfe hat geschrieben:SetXMLEncoding()
Encoding
Dies kann einer der folgenden Werte sein:Dies beeinflusst nur das Exportieren/Speichern des Baums. Die Daten im #XML Objekt werden immer im PB String-Format gespeichert (Ascii oder Unicode, abhängig von der Compiler-Option). Somit kann ein Unicode-Executable für das Speichern die Codierung ohne Probleme in #PB_Ascii ändern und anschließend zurück in eine andere, ohne dabei Informationen zum Baum im Speicher zu verlieren.
- #PB_Ascii
- #PB_Unicode (UTF16)
- #PB_UTF8
und genauso das Importieren/Laden des Baums.Dies beeinflusst nur das Exportieren/Speichern des Baums.
Ja richtig, allerdings liegt der XML String nicht als UTF-8 wie im Sourcode vor wie du meinst, sondern als Unicode String bereits im Speicher.ts-soft hat geschrieben:Bevor die Daten im PB-Stringformat genutzt werden, müssen sie ja erst mal geladen werden. Dabei ist es egal ob
LoadXML oder CatchXML, der String liegt da im UTF-8 Kodierung (oder andere, wenn eingestellt) vor. Erst nach dem
Importieren (Catchen, Laden), geht es mit PB-Stringformat weiter.
Code: Alles auswählen
Define.s xml
Define *bufAscii, *bufUnicode, *bufUtf8
#ENCODING = #PB_Ascii
xml = "<window name='abc月2日更新'></window>"
*bufAscii = AllocateMemory(StringByteLength(xml, #PB_Ascii) + 1)
*bufUnicode = AllocateMemory(StringByteLength(xml, #PB_Unicode) + 2)
*bufUtf8 = AllocateMemory(StringByteLength(xml, #PB_UTF8) + 1)
PokeS(*bufAscii, xml, -1, #PB_Ascii)
PokeS(*bufUnicode, xml, -1, #PB_Unicode)
PokeS(*bufUtf8, xml, -1, #PB_UTF8)
CatchXML(1, *bufAscii, MemorySize(*bufAscii), 0, #ENCODING)
CatchXML(2, *bufUnicode, MemorySize(*bufUnicode), 0, #ENCODING)
CatchXML(3, *bufUtf8, MemorySize(*bufUtf8), 0, #ENCODING)
CatchXML(4, @xml, StringByteLength(xml), 0, #ENCODING)
Debug ComposeXML(1) + " (ascii)"
Debug ComposeXML(2) + " (unicode)"
Debug ComposeXML(3) + " (utf-8)"
Debug ComposeXML(4)Für mich stellt es sich nicht so dar.ts-soft hat geschrieben:der in diesem Falle eine UTF-8 kodierte Text-Datei ist, also der Source der PB-IDE!mhs hat geschrieben:CatchXML liest direkt aus dem Speicher
Code: Alles auswählen
; PB 5.42 LTS x64 unter Windows
; benutztes Dateiformat in der IDE: UTF-8
CompilerIf Not #PB_Compiler_Unicode
CompilerError "Im Unicode-Modus kompilieren!"
CompilerEndIf
s$ = "Äpfel"
Debug s$
Debug PeekS(@s$, -1, #PB_Unicode)
Debug PeekS(@s$, -1, #PB_UTF8)Ausgabe hat geschrieben:Äpfel
Äpfel
�
@Nino: Siehe mein letzter Post kurz vor dirNino hat geschrieben:Für mich stellt es sich nicht so dar.
Daraus dass das Datei-Format des Quelltextes UTF-8 ist, folgt nicht dass PureBasic Stringvariablen (die im RAM existieren und nicht in einer Datei) auch im UTF-8-Format vorliegen. Tatsächlich ist das offenbar auch nicht der Fall:
...
Ja.mhs hat geschrieben:@Nino: Siehe mein letzter Post kurz vor dir
Nein, CatchXML() liest ohne Kodierung-Angabe den String immer als UTF-8 (habe das im vorletztem Beitrag falsch geschrieben, sorry) und das wäre im Ascii- und im Unicode-Modus falsch bei internen Strings.mhs hat geschrieben:bzw. der gesamte CompilerIf Block könnte wegfallen, weil die internen Strings ja eh in der richtigen Kodierung vorliegen.
Zeige mir mal bitte, wo wir gleicher Meinung sind.ts-soft hat geschrieben:Endlich hat er es geschnallt, hoffe ich mal
Der String von XML$ liegt mit eingeschaltetem Unicode-Modus oder ohne eben nicht im UTF-8-Format vor. Beispiel-Codes, die dies beweisen, haben wir ja schon hier geschrieben. Du kannst auch mal das hier jeweils mit und ohne eingeschaltetem Unicode-Modus kompilieren und beide Kompilate mit einem Hex-Editor ansehen:ts-soft hat geschrieben:CatchXML liest den UTF-8 Code ein, der genauso vorliegt, wie als Textdatei auch, und wandelt ihn in Unicode (oder ASCII) um im Programm damit weiter zu arbeiten zu können.
Code: Alles auswählen
XML$ = "Hallo!"Den UTF-8-String bekommt CatchXML() nicht übergeben, weil da der Compiler den UTF-8-String der Source bereits in Unicode umgewandelt hat.ts-soft hat geschrieben:der in diesem Falle eine UTF-8 kodierte Text-Datei ist, also der Source der PB-IDE!mhs hat geschrieben:CatchXML liest direkt aus dem Speicher
Interne Strings im Unicode-Modus sind nicht UTF-8.ts-soft hat geschrieben:Bevor die Daten im PB-Stringformat genutzt werden, müssen sie ja erst mal geladen werden. Dabei ist es egal ob
LoadXML oder CatchXML, der String liegt da im UTF-8 Kodierung (oder andere, wenn eingestellt) vor. Erst nach dem
Importieren (Catchen, Laden), geht es mit PB-Stringformat weiter.