Aktuelle Zeit: 04.06.2020 19:42

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Umlauten beim Einlesen mit ReadCharacter
BeitragVerfasst: 28.03.2020 14:42 
Offline

Registriert: 15.12.2019 16:59
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

_________________
--
Mac OS Catalina, PureBasic 5.71 LTS (MacOS X - x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Umlauten beim Einlesen mit ReadCharacter
BeitragVerfasst: 28.03.2020 15:02 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Umlauten beim Einlesen mit ReadCharacter
BeitragVerfasst: 28.03.2020 16:44 
Offline

Registriert: 15.12.2019 16:59
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

_________________
--
Mac OS Catalina, PureBasic 5.71 LTS (MacOS X - x64)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Umlauten beim Einlesen mit ReadCharacter
BeitragVerfasst: 28.03.2020 17:29 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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
   

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit Umlauten beim Einlesen mit ReadCharacter
BeitragVerfasst: 28.03.2020 18:09 
Offline

Registriert: 15.12.2019 16:59
Bingo! Das war's! Wie soll man auch darauf kommen. In der Dokumentation steht dazu nichts.

Vielen Dank!


Istvan

_________________
--
Mac OS Catalina, PureBasic 5.71 LTS (MacOS X - x64)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye