PB 5.21 LTS x86/x64
ReadStringFormat() und WriteStringFormat() verwenden ein falsches BOM für #PB_UTF32 und #PB_UTF32BE.
Die richtigen BOMs habe ich aus Wikipedia entnommen (en, de). Der Bug scheint schon seit der Einführung von ReadStringFormat() und WriteStringFormat() zu existieren. Es dauerte nur Jahre, bis ich meinem ersten UTF-32 String begegnete. Scheinbar wurde Nibble-Order und Byte-Order durcheinandergewürfelt.
Demo-Code:
Code: Alles auswählen
Procedure.s WikipediaBOM(PB_Stringformat)
Select PB_Stringformat
Case #PB_Ascii : ProcedureReturn "(ASCII)"
Case #PB_UTF8 : ProcedureReturn "EF BB BF"
Case #PB_Unicode : ProcedureReturn "FF FE"
Case #PB_UTF16BE : ProcedureReturn "FE FF"
Case #PB_UTF32 : ProcedureReturn "FF FE 00 00"
Case #PB_UTF32BE : ProcedureReturn "00 00 FE FF"
EndSelect
ProcedureReturn "(unbekanntes Stringformat)"
EndProcedure
Procedure.s PureBasicBOM(PB_Stringformat)
; Name für Temp-Datei zum BOM-Schreiben definieren
FileName$ = GetTemporaryDirectory() + "PB_TEMP_"
While FileSize(FileName$) <> -1
FileName$ + Chr( 'A' + Random( 'Z'-'A' ) )
Wend
If CreateFile(0, FileName$)
; BOM schreiben
WriteStringFormat(0, PB_Stringformat)
FileSeek(0,0)
While Eof(0) = #False
; BOM byteweise lesen
Result$ + RSet(Hex(ReadByte(0),#PB_Byte),2,"0" ) + " "
Wend
Result$ = Left(Result$, Len(Result$) - 1)
CloseFile(0)
; Temp-Datei löschen
DeleteFile(FileName$, #PB_FileSystem_Force)
Else
ProcedureReturn "CreateFile() = #False"
EndIf
If Result$ = ""
Result$ = "(ASCII)"
EndIf
ProcedureReturn Result$
EndProcedure
Macro _DQ_
"
EndMacro
Macro DebugBOM(PB_Stringformat)
a$ = WikipediaBOM(PB_Stringformat)
b$ = PureBasicBOM(PB_Stringformat)
If a$ = b$
Debug "--- OK ---"
Else
Debug "--- FALSCH! ---"
EndIf
Debug _DQ_#PB_Stringformat#_DQ_
Debug a$ + " [wiki]"
Debug b$ + " [PB]"
Debug ""
EndMacro
DebugBOM(#PB_Ascii)
DebugBOM(#PB_UTF8)
DebugBOM(#PB_Unicode)
DebugBOM(#PB_UTF16BE)
DebugBOM(#PB_UTF32)
DebugBOM(#PB_UTF32BE)
Code: Alles auswählen
--- OK ---
#PB_Ascii
(ASCII) [wiki]
(ASCII) [PB]
--- OK ---
#PB_UTF8
EF BB BF [wiki]
EF BB BF [PB]
--- OK ---
#PB_Unicode
FF FE [wiki]
FF FE [PB]
--- OK ---
#PB_UTF16BE
FE FF [wiki]
FE FF [PB]
--- FALSCH! ---
#PB_UTF32
FF FE 00 00 [wiki]
FF EF 00 00 [PB]
--- FALSCH! ---
#PB_UTF32BE
00 00 FE FF [wiki]
00 00 FF FE [PB]