Ich habe das Thema eine Weile ruhen lassen und bin nun nochmal herangegangen. Soll manchmal helfen...
Meine Verwechslungen in den vorherigen Beiträgen habe ich mit Korrekturen versehen.
Das Verhalten von CatchXML() ist für mich aber weiterhin nicht nachvollziehbar.
Code: Alles auswählen
CompilerIf Not #PB_Compiler_Unicode
CompilerError "Run it in unicode mode!"
CompilerEndIf
XML$ = "<text>Hello?" + Chr(1000) + Chr(1200) + "</text>"
#XML = 0
CatchXML(#XML, @XML$, StringByteLength(XML$, #PB_Unicode), 0, #PB_Ascii)
Debug "CatchXML(#PB_Ascii): " + ComposeXML(#XML)
FreeXML(#XML)
CatchXML(#XML, @XML$, StringByteLength(XML$, #PB_Unicode), 0, #PB_UTF8)
Debug "CatchXML(#PB_UTF8): " + ComposeXML(#XML)
FreeXML(#XML)
CatchXML(#XML, @XML$, StringByteLength(XML$, #PB_Unicode), 0, #PB_Unicode)
Debug "CatchXML(#PB_Unicode): " + ComposeXML(#XML)
FreeXML(#XML)
Debug "---------------"
Debug "StringByteLength(): " + Str(StringByteLength(XML$))
Debug "StringByteLength(#PB_Ascii): " + Str(StringByteLength(XML$, #PB_Ascii))
Debug "StringByteLength(#PB_UTF8): " + Str(StringByteLength(XML$, #PB_UTF8))
Debug "StringByteLength(#PB_Unicode): " + Str(StringByteLength(XML$, #PB_Unicode))
Debug "----------------"
Debug "PeekS(#PB_Ascii): " + PeekS(@XML$, -1, #PB_Ascii)
Debug "PeekS(#PB_UTF8): " + PeekS(@XML$, -1, #PB_UTF8)
Debug "PeekS(#PB_Unicode): " + PeekS(@XML$, -1, #PB_Unicode)
Code: Alles auswählen
[13:19:24] CatchXML(#PB_Ascii): <?xml version="1.0" encoding="UTF-16"?><text>Hello?ϨҰ</text>
[13:19:24] CatchXML(#PB_UTF8): <?xml version="1.0" encoding="UTF-16"?><text>Hello?ϨҰ</text>
[13:19:24] CatchXML(#PB_Unicode): <?xml version="1.0" encoding="UTF-16"?><text>Hello?ϨҰ</text>
[13:19:24] ---------------
[13:19:24] StringByteLength(): 42
[13:19:24] StringByteLength(#PB_Ascii): 19
[13:19:24] StringByteLength(#PB_UTF8): 23
[13:19:24] StringByteLength(#PB_Unicode): 42
[13:19:24] ----------------
[13:19:24] PeekS(#PB_Ascii): <
[13:19:24] PeekS(#PB_UTF8): <
[13:19:24] PeekS(#PB_Unicode): <text>Hello?ϨҰ</text>
Hier ist es für mich unverständlich, warum der Unicode-String "XML$" als Ascii, UTF8 und Unicode gelesen immer korrekte Ausgaben liefert.
Wenn ein Unicode-String in einer anderen Codierung gelesen wird, kann doch eigentlich nichts Sinnvolles ausgegeben werden. Bei PeekS() ist es ja auch so:
Code: Alles auswählen
Text$ = "Das ist der Text°°°°!"
AsciiText$ = PeekS(@Text$, -1, #PB_Ascii)
Debug PeekS(@AsciiText$, -1, #PB_Unicode)
Obiger Code im Ascii-Modus kompiliert:
Obiger Code im Unicode-Modus kompiliert:
Code: Alles auswählen
Text$ = "<text>Das ist der Text°°°°!</text>"
*Ascii_Memory = AllocateMemory(StringByteLength(Text$, #PB_Ascii) + 1, #PB_Memory_NoClear)
*UTF8_Memory = AllocateMemory(StringByteLength(Text$, #PB_UTF8) + 1, #PB_Memory_NoClear)
*Unicode_Memory = AllocateMemory(StringByteLength(Text$, #PB_Unicode) + 2, #PB_Memory_NoClear)
If *Ascii_Memory = 0 Or *UTF8_Memory = 0 Or *Unicode_Memory = 0
End
EndIf
PokeS(*Ascii_Memory, Text$, -1, #PB_Ascii)
PokeS(*UTF8_Memory, Text$, -1, #PB_UTF8)
PokeS(*Unicode_Memory, Text$, -1, #PB_Unicode)
Debug "Lese Ascii-String als ..."
If CatchXML(0, *Ascii_Memory, StringByteLength(Text$, #PB_Ascii), 0, #PB_Ascii)
Debug "-- Ascii: " + ComposeXML(0)
FreeXML(0)
EndIf
If CatchXML(0, *Ascii_Memory, StringByteLength(Text$, #PB_Ascii), 0, #PB_UTF8)
Debug "-- UTF8: " + ComposeXML(0)
FreeXML(0)
EndIf
If CatchXML(0, *Ascii_Memory, StringByteLength(Text$, #PB_Ascii), 0, #PB_Unicode)
Debug "-- Unicode: " + ComposeXML(0)
FreeXML(0)
EndIf
Debug ""
Debug "Lese UTF8-String als ..."
If CatchXML(0, *UTF8_Memory, StringByteLength(Text$, #PB_UTF8), 0, #PB_Ascii)
Debug "-- Ascii: " + ComposeXML(0)
FreeXML(0)
EndIf
If CatchXML(0, *UTF8_Memory, StringByteLength(Text$, #PB_UTF8), 0, #PB_UTF8)
Debug "-- UTF8: " + ComposeXML(0)
FreeXML(0)
EndIf
If CatchXML(0, *UTF8_Memory, StringByteLength(Text$, #PB_UTF8), 0, #PB_Unicode)
Debug "-- Unicode: " + ComposeXML(0)
FreeXML(0)
EndIf
Debug ""
Debug "Lese Unicode-String als ..."
If CatchXML(0, *Unicode_Memory, StringByteLength(Text$, #PB_Unicode), 0, #PB_Ascii)
Debug "-- Ascii: " + ComposeXML(0)
FreeXML(0)
EndIf
If CatchXML(0, *Unicode_Memory, StringByteLength(Text$, #PB_Unicode), 0, #PB_UTF8)
Debug "-- UTF8: " + ComposeXML(0)
FreeXML(0)
EndIf
If CatchXML(0, *Unicode_Memory, StringByteLength(Text$, #PB_Unicode), 0, #PB_Unicode)
Debug "-- Unicode: " + ComposeXML(0)
FreeXML(0)
EndIf
Obiger Code mit Ascii-Modus kompiliert:
Code: Alles auswählen
[13:21:03] Lese Ascii-String als ...
[13:21:03] -- Ascii: <?xml version="1.0" encoding="ISO-8859-1"?><text>Das ist der Text°°°°!</text>
[13:21:03] -- UTF8: <?xml version="1.0" encoding="ISO-8859-1"?><text>Das ist der Text</text>
[13:21:03] -- Unicode: <?xml version="1.0" encoding="ISO-8859-1"?>
[13:21:03]
[13:21:03] Lese UTF8-String als ...
[13:21:03] -- Ascii: <?xml version="1.0" encoding="ISO-8859-1"?><text>Das ist der Text°°°°!</text>
[13:21:03] -- UTF8: <?xml version="1.0" encoding="ISO-8859-1"?><text>Das ist der Text°°°°!</text>
[13:21:03] -- Unicode: <?xml version="1.0" encoding="ISO-8859-1"?>
[13:21:03]
[13:21:03] Lese Unicode-String als ...
[13:21:03] -- Ascii: <?xml version="1.0" encoding="ISO-8859-1"?><text>Das ist der Text°°°°!</text>
[13:21:03] -- UTF8: <?xml version="1.0" encoding="ISO-8859-1"?><text>Das ist der Text°°°°!</text>
[13:21:03] -- Unicode: <?xml version="1.0" encoding="ISO-8859-1"?><text>Das ist der Text°°°°!</text>
Obiger Code mit Unicode-Modus kompiliert:
Code: Alles auswählen
[13:22:08] Lese Ascii-String als ...
[13:22:08] -- Ascii: <?xml version="1.0" encoding="UTF-16"?><text>Das ist der Text°°°°!</text>
[13:22:08] -- UTF8: <?xml version="1.0" encoding="UTF-16"?><text>Das ist der Text</text>
[13:22:08] -- Unicode: <?xml version="1.0" encoding="UTF-16"?>
[13:22:08]
[13:22:08] Lese UTF8-String als ...
[13:22:08] -- Ascii: <?xml version="1.0" encoding="UTF-16"?><text>Das ist der Text°°°°!</text>
[13:22:08] -- UTF8: <?xml version="1.0" encoding="UTF-16"?><text>Das ist der Text°°°°!</text>
[13:22:08] -- Unicode: <?xml version="1.0" encoding="UTF-16"?>
[13:22:08]
[13:22:08] Lese Unicode-String als ...
[13:22:08] -- Ascii: <?xml version="1.0" encoding="UTF-16"?><text>Das ist der Text°°°°!</text>
[13:22:08] -- UTF8: <?xml version="1.0" encoding="UTF-16"?><text>Das ist der Text°°°°!</text>
[13:22:08] -- Unicode: <?xml version="1.0" encoding="UTF-16"?><text>Das ist der Text°°°°!</text>
Hier ist es ebenfalls wie oben: Der Unicode-String wird jedes Mal korrekt gelesen. Ascii, UTF8 und Unicode haben doch unterschiedliche Codierungen, wie kann das dann trotzdem funktionieren?
