[5.21 LTS] Read/WriteStringFormat -> falsches BOM

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

[5.21 LTS] Read/WriteStringFormat -> falsches BOM

Beitrag von Regenduft »

Hab's zwar schon ins offizielle Forum geposted, aber da es für den einen oder anderen ohne Englischkenntnisse interessant seien könnte, dass da seit Ewigkeiten ein Bug in PB schlummert, nochmal hier auf Deutsch:

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. :wink:

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)
Debugger-Ausgabe des Demo-Codes:

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]
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)