Seite 1 von 3

"OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierungen

Verfasst: 15.03.2016 13:24
von Sicro

Code: Alles auswählen

CompilerIf #PB_Compiler_Unicode
  #XmlEncoding = #PB_UTF8
CompilerElse 
  #XmlEncoding = #PB_Ascii
CompilerEndIf
[...]
If CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #XmlEncoding)
Ist es nicht besser, die XML-Codierung im Unicode-Modus auf "Unicode" zu stellen?
So wie es ist, liest "CatchXML()" den XML-Code im Unicode-Modus als Unicode, markiert diesen aber durch den gesetzten Codierung-Parameter als "UTF8".

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 03.04.2016 16:39
von Sicro
Kann niemand etwas dazu sagen?

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 03.04.2016 16:58
von ts-soft
Was soll man sagen? Es ist normal und üblich, das Unicode-Text, der auch in Dateien gespeichert wird, immer in UTF-8
vorliegt. Auch die IDE nutzt UTF-8 im Unicode-Mode zum Speichern. Lediglich im Speicher des Programms wird auch
Unicode verwendet, weil es dort einfacher zu händeln ist (Stringmanipulation im Speicher usw.).

Es ist gut, so wie es ist und es wird besser, wenn ASCII endlich abgeschafft wird :wink:

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 06.04.2016 19:22
von Sicro
ts-soft hat geschrieben:Es ist normal und üblich, das Unicode-Text, der auch in Dateien gespeichert wird, immer in UTF-8 vorliegt. Auch die IDE nutzt UTF-8 im Unicode-Mode zum Speichern.
Da hast du recht, das stelle ich aber hier auch nicht in Frage.
ts-soft hat geschrieben:Lediglich im Speicher des Programms wird auch Unicode verwendet, weil es dort einfacher zu händeln ist (Stringmanipulation im Speicher usw.).
Gut, hier sind wir uns also einig: XML$ enthält Unicode im Unicode-Modus.
Jetzt schau dir mal den Code von CatchXML() an. Als zu lesende Bytes wird die Rückgabe von StringByteLength(XML$) übergeben, das im Unicode-Modus die benötigten Bytes ermittelt, die für den Unicode-String in XML$ erforderlich sind. Zuletzt wird im Unicode-Modus als Codierung "UTF8" angegeben.
  • Unicode benötigt immer 2 Bytes pro Zeichen
  • UTF8 benötigt 1 bis 4 Bytes pro Zeichen
Die Fehler im Code:
  • XML$ enthält im Unicode-Modus UNICODE und muss von CatchXML() auch als UNICODE gelesen werden
  • StringByteLength(XML$) liefert die falsche Anzahl der zu lesenden Bytes für UTF8 im Unicode-Modus
ts-soft hat geschrieben:Es ist gut, so wie es ist
Nein ;-)
ts-soft hat geschrieben:es wird besser, wenn ASCII endlich abgeschafft wird :wink:
Naja, dann geht es weiter mit den verschiedenen Unicode-Codierungen (UTF8, UTF16BE, UTF16LE, UTF32)...

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 06.04.2016 20:15
von ts-soft
Verstehe Deine Logik nicht. 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.

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 06.04.2016 22:47
von Sicro
PB speichert den Code (und den String) als UTF8 in die Code.pb, aber der String ist in XML$ UNICODE.

Vielleicht ist es so nachvollziehbar:

Code: Alles auswählen

 CompilerIf Not #PB_Compiler_Unicode
  CompilerError "Im Unicode-Modus kompilieren!"
CompilerEndIf


XML$ = "<window>...</window>"

Debug "String als Unicode: " + Str(StringByteLength(XML$))           + " Bytes"
Debug "String als UTF8:    " + Str(StringByteLength(XML$, #PB_UTF8)) + " Bytes"

Debug ""
Debug "------"
Debug ""

Debug "String als Unicode gelesen: " + PeekS(@XML$, -1, #PB_Unicode)
Debug "String als UTF8 gelesen:    " + PeekS(@XML$, -1, #PB_UTF8)

Debug ""
Debug "------"
Debug ""

; CatchXML(#Xml, @XML$, StringByteLength(XML$), 0, #PB_UTF8) macht das:
Debug PeekS(@XML$, StringByteLength(XML$), #PB_UTF8) ; und übergibt es dann an die XML-Lib

Code: Alles auswählen

[23:07:13] String als Unicode: 40 Bytes
[23:07:13] String als UTF8:    20 Bytes
[23:07:13] 
[23:07:13] ------
[23:07:13] 
[23:07:13] String als Unicode gelesen: <window>...</window>
[23:07:13] String als UTF8 gelesen:    <
[23:07:13] 
[23:07:13] ------
[23:07:13] 
[23:07:13] <
Hm... CatchXML() funktioniert anscheinend doch anders... :freak:

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 07.04.2016 08:40
von mhs
Grundsätzlich hast du recht, dass der String als Unicode im Speicher liegt.

CatchXML liest direkt aus dem Speicher und zusätzlich wird auch die Länge des gesamten Speicherbereichs angegeben, von daher ist es scheinbar relativ egal, welche Kodierung bei CatchXML angegeben wird. Die Funktion verhält sich jedenfalls nicht ganz so wie erwartet, das ist richtig...

Einen erkennbaren Unterschied gibt es erst, wenn der XML Baum dann per SaveXML in eine Datei gespeichert wird, dort ist die bei CatchXML angegebene Codierung dann bedeutend und die Datei wird mit dem entsprechenden Header versehen.

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 07.04.2016 15:19
von ts-soft
mhs hat geschrieben:CatchXML liest direkt aus dem Speicher
der in diesem Falle eine UTF-8 kodierte Text-Datei ist, also der Source der PB-IDE!

Wollt Ihr das nicht verstehen :D

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 07.04.2016 15:55
von mhs
Stehe ich etwa auf dem Schlauch?

Bei

Code: Alles auswählen

XML$ = "<window>...</window>"
weisst er den Text doch einer String Variablen zu und damit liegt der String doch als UCS-2 im Speicher?!?

Genau das wollte Sicro mit seinem letzten Beispiel und der StringByteLength und PeekS zeigen.

Re: "OpenXMLDialog()"-Beispiel-Codes: merkwürdige Codierunge

Verfasst: 07.04.2016 17:19
von Sicro
mhs hat geschrieben:Einen erkennbaren Unterschied gibt es erst, wenn der XML Baum dann per SaveXML in eine Datei gespeichert wird, dort ist die bei CatchXML angegebene Codierung dann bedeutend und die Datei wird mit dem entsprechenden Header versehen.
Genau, so ist es. CatchXML() liest im Ascii-Modus den String als Ascii und im Unicode-Modus als Unicode. Der letzte Parameter bei CatchXML() für die Codierung regelt nicht, wie @XML$ gelesen werden soll, sondern ob im XML-Baum

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
oder

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
stehen soll.
So, jetzt haben wir es endlich herausgefunden. :allright:
Die Beschreibung in der Hilfe ist missverständlich und sollte verbessert werden.
Edit: Das stimmt nicht. Der Codierung-Parameter beeinflusst das Lesen des Strings vom Memory sehr wohl und standardmäßig liest CatchXML den String vom Memory als UTF-8.
ts-soft hat geschrieben:
mhs hat geschrieben:CatchXML liest direkt aus dem Speicher
der in diesem Falle eine UTF-8 kodierte Text-Datei ist, also der Source der PB-IDE!
PB kompiliert im Unicode-Modus keine UTF8-EXE, sondern eine UNICODE-EXE. Da ist nichts mehr mit UTF8 und auch kein Source mehr mit UTF8. Alle Strings sind dann Unicode.
Hier, schau mal:

Code: Alles auswählen

CompilerIf Not #PB_Compiler_Unicode
  CompilerError "Im Unicode-Modus kompilieren!"
CompilerEndIf

XML$ = "<window></window>"

Debug "CatchXML: " + CatchXML(0, @XML$, StringByteLength(XML$), 0, #PB_UTF8)
Debug "XMLError: " + XMLError(0)
Debug "---"
Debug "CatchXML: " + CatchXML(1, @XML$, StringByteLength(XML$, #PB_UTF8), 0, #PB_UTF8)
Debug "XMLError: " + XMLError(1)
Warum geht das dann nicht? Weil XML$ Unicode ist!