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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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".
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag von Sicro »

Kann niemand etwas dazu sagen?
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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)...
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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:
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

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

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

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

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
Sicro
Beiträge: 968
Registriert: 11.08.2005 19:08
Kontaktdaten:

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

Beitrag 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!
Zuletzt geändert von Sicro am 07.05.2016 16:49, insgesamt 1-mal geändert.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten