Unerwünschte Effekte bei RTF-Datei einlesen und speichern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
wie_jetzt?
Beiträge: 21
Registriert: 28.08.2017 17:23

Unerwünschte Effekte bei RTF-Datei einlesen und speichern

Beitrag von wie_jetzt? »

Hallo Allerseits!

In meinem Projekt soll mein Proggi eine RTF-Datei (Textvorlage mit Platzhaltern) einlesen, die Platzhalter gemäss Usereingaben ersetzen und als temoräre RTF-Datei wieder speichern.

Meine Testroutine sieht so aus:

Code: Alles auswählen

ErsatzString$="abcABC 123"
buffer$=""

If ReadFile(0, GetUserDirectory(#PB_Directory_Documents)+"vorlage.rtf")
  While Eof(0) = 0
    buffer$ = buffer$ + ReadString(0)
  Wend
  CloseFile(0)
  
  buffer$ = ReplaceString(buffer$, "**V_Platzhalter1**", ErsatzString$)

; hier stehen später noch ca. 25 andere Platzhaltertausche, der jeweilige Platzhalter wird je nach Usereingabe mit einem kürzeren oder auch längeren String ersetzt. 


  If CreateFile(1, GetUserDirectory(#PB_Directory_Documents)+"fertigtext.rtf")
    WriteStringN(1, buffer$)
    CloseFile(1)
  Else
    MessageRequester("Info","Datei nicht erstellt")
  EndIf
 
Else
  MessageRequester("Info","Vorlage nicht geöffnet")
EndIf
Die Dateien werden gefunden, Prog läuft fehlerfrei durch, der Platzhalter auf der ersten Seite wird ersetzt. Hierbei entstehen jedoch 2 Probleme:
a) Umlaute, ß (und evtl. auch andere Zeichen) werden falsch dargestellt
b) An einer ganz anderen Stelle auf Seite 2 wird aus "Ort, Datum, Unterschrift" der "Ort" entfernt, es bleibt ", Datum, Unterschrift".

Was muss ich mit den Umlauten anstellen, damit die korrekt eingetragen werden?
Kann es sein, dass ich die RTF-Datei nicht so einlesen darf? Oder entsteht der Fehler beim Schreibvorgang? Muss man die Datei evtl. byteweise einlesen und/oder byteweise schreiben? Wie wäre der richtige Weg?
Was das Programmieren angeht, bin ich ein Anfänger mit fast 40 Jahren Erfahrung, mit gelegentlichen, mitunter jahrzehntelangen Unterbrechungen. Kann mich noch dunkel an den TI58 bei der Bundeswehr Anfang der 1980er erinnern. Habe da mit "Mondlandung" viele Stunden der Heimatverteidung verbracht - Insider werden's kennen.
... wir hatten doch sonst nix!
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Unerwünschte Effekte bei RTF-Datei einlesen und speicher

Beitrag von ts-soft »

Welche Compileroption? Unicode oder ASCII (ab 5.60 immer Unicode)
Welche Codierung nutzt Dein Source (ASCII oder UTF8)
Welche Codierung erwartet Dein RTF-Text, ReadString hat z.B. einen 2ten parameter.
Beim Schreiben natürlich dasselbe.

Jetzt nur noch alles abstimmen und es gibt keine Probleme mehr <)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Unerwünschte Effekte bei RTF-Datei einlesen und speicher

Beitrag von ts-soft »

Kleines Beispiel:
Deine MusterRTF mal ein äöüß einfügen, mit dem Editor, mit dem es erstellt wurde. Jetzt mit PB einlesen, solange bis da wirklich wieder äöüß rauskommt, also mit ReadString(#MeinRTF, Flag); Flag mal alle 3 durchprobieren :wink:
Denselben Flag dann auch bei WriteString() nutzen.

Ist eigentlich ganz einfach und findet man mit etwas Erfahrung von selber raus.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
wie_jetzt?
Beiträge: 21
Registriert: 28.08.2017 17:23

Re: Unerwünschte Effekte bei RTF-Datei einlesen und speicher

Beitrag von wie_jetzt? »

Hallo ts-soft,

besten Dank für die Tipps. Compiler ist jetzt auf Ascii eingestellt. Laden und speichern habe ich jetzt mit readbyte bzw. writebyte gemacht, womit sich das Problem der verschwundenen Buchstaben erledigt hat. Mein Verdacht: Offenbar werden mit Readstring Daten eingelesen, die beim Schreiben Fehler verursachen (Steuercodes, Backspace, keine Ahnung was). Funktioniert also so, wie ich es mir gewünscht habe.

Allerdings muss man bei der RTF-Textvorlage (mittels LibreOffice erstellt) aufpassen - scheinbar wird die eine oder andere Formatierung durch meine Textmanipulation gestört. Entweder, weil das RTF damit gar nicht klar kommt (verschiedene Fusszeilen, pipapo) oder weil mit meiner Manipulation irgendwas in der Formatierung kaputt geht. Muss man halt ausprobieren, was geht und was nicht.

Ich habe RTF gewählt, weil ich ein Dateiformat brauche, was einerseits mit LibreOffice zu bearbeiten ist (mit Formatierungen und so), andererseits mit einfachen Mitteln via PB zu manipulieren ist. Moderne Dateiformate sind gepackt und - jedenfalls für mich - viel zu kompliziert aufgebaut, jedenfalls, soweit ich das überblicken kann. Hatte auch an HTML gedacht, falls RTF in eine Sackgasse führen würde. Wenn jemand ein noch besser geeignetes Dateiformat kennt - freue mich über jeden Tipp.
Was das Programmieren angeht, bin ich ein Anfänger mit fast 40 Jahren Erfahrung, mit gelegentlichen, mitunter jahrzehntelangen Unterbrechungen. Kann mich noch dunkel an den TI58 bei der Bundeswehr Anfang der 1980er erinnern. Habe da mit "Mondlandung" viele Stunden der Heimatverteidung verbracht - Insider werden's kennen.
... wir hatten doch sonst nix!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Unerwünschte Effekte bei RTF-Datei einlesen und speicher

Beitrag von NicTheQuick »

OpenOffice-Dateien sind eigentlich nur ZIPs und darin enthalten sind XML-Dateien, die Formatierungen, Kopf- und Fußzeilen und den eigentlichen Inhalt repräsentieren. Man muss sich einlesen, aber ich erstelle LibreOffice-Dateien komplett selbst mittels Python aus Daten, die in einem anderen Format vorliegen. Mit Purebasic ist das vermutlich nicht so schön handlich wie mit Python zu lösen, aber auch machbar.
Bild
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Unerwünschte Effekte bei RTF-Datei einlesen und speicher

Beitrag von juergenkulow »

Code: Alles auswählen

; Erzeuge RTF-Umlaute und Unicode-Zeichen, wie Euro und großes SZ.
; offen Unicode>=$10000
EnableExplicit
Define Test$="ÄÖÜ SZ:"+Chr(7838)+"äöüß Euro:"+Chr(8364)+"µ²³°\áàâéèêíìîóòôúùûýÁÀÂÉÈÊÍÌÎÓÒÔÚÙÛÝ"
ShowMemoryViewer(@Test$,Len(Test$)*2)
Define i
Define RTFText.s=""
For i=1 To Len(Test$) 
  Define UniCodeWert=Asc(Mid(Test$,i,1))
  If UniCodeWert<$5C ; Ascii
    RTFText+Chr(UniCodeWert)  
  ElseIf UniCodeWert=$5C ; Rückstrich Sonderbehandlung 
    RTFText+"\\"
  ElseIf UniCodeWert>$5C And UniCodeWert<$80 ; Ascii
    RTFText+Chr(UniCodeWert)    
  ElseIf UniCodeWert<=$ff
    RTFText+"\u"+Str(UniCodeWert)+"\'"+LCase(Hex(UniCodeWert))
  Else
    RTFText+"\u"+Str(UniCodeWert)+"\'80"
  EndIf   
Next 
Debug RTFText
;\u196\'c4\u214\'d6\u220\'dc SZ:\u7838\'80\u228\'e4\u246\'f6\u252\'fc\u223\'df Euro:\u8364\'80\u181\'b5\u178\'b2\u179\'b3\u176\'b0\\\u225\'e1\u224\'e0\u226\'e2\u233\'e9\u232\'e8\u234\'ea\u237\'ed\u236\'ec\u238\'ee\u243\'f3\u242\'f2\u244\'f4\u250\'fa\u249\'f9\u251\'fb\u253\'fd\u193\'c1\u192\'c0\u194\'c2\u201\'c9\u200\'c8\u202\'ca\u205\'cd\u204\'cc\u206\'ce\u211\'d3\u210\'d2\u212\'d4\u218\'da\u217\'d9\u219\'db\u221\'dd


Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Antworten