PureBoard
http://forums.purebasic.com/german/

Problem mit Umlauten beim Einlesen mit ReadCharacter
http://forums.purebasic.com/german/viewtopic.php?f=16&t=31928
Seite 1 von 1

Autor:  Istvan42 [ 28.03.2020 14:42 ]
Betreff des Beitrags:  Problem mit Umlauten beim Einlesen mit ReadCharacter

Hallo zusammen,

ich stehe bei folgendem Problem auf dem Schlauch. In einer Textdatei steht folgender Inhalt:

Code:
Das ist mein Test!
Für die Tür einen Öffner!


Die Datei ist als UTF-8 mit BOM erstellt worden. Wenn ich mittels ReadCharacter aus dieser Datei zeichenweise den Inhalt einlese und an einen String übergebe, dann erhalte ich folgende Ausgabe:

Code:
??Das ist mein Test!
Fü?r die Tü?r einen Ö?ffner


Wenn ich den Inhalt zeilenweise mit ReadString einlese, dann ist das Ergebnis korrekt.

Hat jemand eine Erklärung dafür? Wie kann ich den Inhalt korrekt zeichenweise Einlesen und an einen String übergeben?

Hier mein Test-Code

Code:
EnableExplicit

Enumeration
    #Filehandler
EndEnumeration

Define sFilename.s, sContent.s, sUnicode.s, sFileString.s
Define iFilepos.i, iCharForm.i, iBOM.i
Define cFileChar.c

;iCharForm = #PB_Ascii
iCharForm = #PB_UTF8
;iCharForm = #PB_Unicode

sFilename = OpenFileRequester("Datei öffnen", "Test.txt", "Text-Datei (*txt) | *.txt", 0)

; lesen einzelner Zeichen
If ReadFile(#Filehandler, sFilename, iCharForm)
    ; Prüfen BOM (Byte Order Mark) 
    iBOM = ReadStringFormat(#Filehandler)
    Select iBOM
        Case #PB_Ascii
            MessageRequester("Format", "Ascii")
        Case #PB_UTF8
            MessageRequester("Format", "UTF8")
        Case #PB_Unicode
            MessageRequester("Format", "Unicode")
        Default
            MessageRequester("Format", "Was anderes")
    EndSelect
    While Eof(#Filehandler) = 0
        FileSeek(#Filehandler, iFilepos)
        cFileChar = ReadCharacter(#Filehandler, iCharForm)
        sContent + Chr(cFileChar)
        iFilepos + 1
    Wend
    MessageRequester("Content zeichenweise", sContent)
    ; lesen von Zeilen
    FileSeek(#Filehandler, 0) ; beginne am Anfang
    While Eof(#Filehandler) = 0
        sFileString + ReadString(#Filehandler, iCharForm) + Chr(13)
    Wend
    MessageRequester("Content zeilenweise", sFileString)
    CloseFile(#Filehandler)
Else
    MessageRequester("Fehler", "Beim lesen der Datei ist ein Fehler aufgetreten.")
EndIf


Gruß
Istvan

Autor:  mk-soft [ 28.03.2020 15:02 ]
Betreff des Beitrags:  Re: Problem mit Umlauten beim Einlesen mit ReadCharacter

Bei UTF8 sind alle Zeichen über ASC 127 mit zwei oder mehr Byte kodiert.
Somit muss man, wenn man diese selber Zeichen für Zeichen liest, selber diese dekodieren.

Das macht aber keinen sinn, da diese PB selber machen kann

Es ist besser die Datei mit ReadString mit Format Info zu lesen, da die Umwandlung nach intern UNICODE automatisch erfolgt.

P.S. Hatte lange weile
Code:
;-TOP
; Read And Write TextFile by mk-soft, v1.02, 28.03.2020

EnableExplicit

Procedure ReadFileToList(FileName.s, List TextList.s()) ; Result Format (BOM)
  Protected file, format
 
  ClearList(TextList())
 
  file = ReadFile(#PB_Any, FileName)
  If file = 0
    Debug "Error Open File: " + FileName
    ProcedureReturn 0
  EndIf
 
  format = ReadStringFormat(file)
  If format = 0
    Debug "Error Read BOM: " + FileName
    CloseFile(file)
    ProcedureReturn 0
  EndIf
 
  While Not Eof(file)
    AddElement(TextList())
    TextList() = ReadString(file, format)
  Wend
 
  CloseFile(file)
 
  ProcedureReturn format
 
EndProcedure

; ----

Procedure WriteFileFromList(FileName.s, List TextList.s(), Format = #PB_UTF8) ; Result wrote lines
  Protected file, cnt
 
  If Format <> #PB_Ascii And Format <> #PB_UTF8 And Format <> #PB_Unicode
    Debug "Error BOM not supported: " + FileName
    ProcedureReturn 0
  EndIf
 
  file = CreateFile(#PB_Any, FileName, Format)
  If file = 0
    Debug "Error Create File: " + FileName
    ProcedureReturn 0
  EndIf
 
  If WriteStringFormat(file, Format) = 0
    Debug "Error Write BOM: " + FileName
    CloseFile(file)
    ProcedureReturn 0
  EndIf
   
  ForEach TextList()
    If WriteStringN(file, TextList()) = 0
      Debug "Error Write Line: " + FileName
      CloseFile(file)
      ProcedureReturn 0
    Else
      cnt + 1
    EndIf
  Next
 
  CloseFile(file)
 
  ProcedureReturn cnt
 
EndProcedure

; ****

Global NewList Text.s()

Define filename.s, bom, cnt

filename.s = OpenFileRequester("Open", "", "", 0)
If filename
  bom = ReadFileToList(filename, Text())
  Debug "BOM = " + bom
EndIf

ForEach Text()
  Debug Text()
Next

filename.s = SaveFileRequester("Save", filename + ".txt", "", 0)
If filename
  cnt = WriteFileFromList(filename, Text(), bom)
EndIf

Autor:  Istvan42 [ 28.03.2020 16:44 ]
Betreff des Beitrags:  Re: Problem mit Umlauten beim Einlesen mit ReadCharacter

Was ich aber nicht verstehe ist, dass man z.B. das Format #PB_UTF8 bei ReadCharacter() mitgeben kann. Die Rückgabe von ReadCharacter() ist vom speziellen Variablentyp 'Character' (.c) und PureBasic schaltet automatisch von 1 Byte auf 2 Bytes um, wenn Unicode aktiviert ist.
Grundsätzlich sollte es also gehen und vermutlich mache ich einen Denkfehler oder ich verstehe die Dokumentation nicht richtig.

Gruß
Istvan

Autor:  mk-soft [ 28.03.2020 17:29 ]
Betreff des Beitrags:  Re: Problem mit Umlauten beim Einlesen mit ReadCharacter

Ein Gedankenfehler...

Du darfst nicht FileSeek verwenden. ReadCharacter setzt automatisch auf das nächste zeichen.
Code:
While Eof(#Filehandler) = 0
        ;FileSeek(#Filehandler, iFilepos)
        cFileChar = ReadCharacter(#Filehandler, iCharForm)
        sContent + Chr(cFileChar)
        iFilepos + 1
    Wend
   

Autor:  Istvan42 [ 28.03.2020 18:09 ]
Betreff des Beitrags:  Re: Problem mit Umlauten beim Einlesen mit ReadCharacter

Bingo! Das war's! Wie soll man auch darauf kommen. In der Dokumentation steht dazu nichts.

Vielen Dank!


Istvan

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/