Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Text aus Datei laden, Single Quote Problem (https://www.delphipraxis.net/201035-text-aus-datei-laden-single-quote-problem.html)

DieDolly 17. Jun 2019 21:00

Text aus Datei laden, Single Quote Problem
 
Ich lese Text aus einer Datei, der dann in meinem Programm angezeigt wird.
Das klappt gut bis zu dem, Zeitpunkt, wenn ein zu ladener String einen Quote enthält wie er in England oder Frankreich benutzt wird

Zitat:

Bli b'la blub
Zitat:

Don't
Ich kann das ins Programm laden und es gibt keinen Fehler. Aber ein so in eine Variable geschriebener Satz in einem MessageDlg erzeugt keinen Umbruch nach den Windows typischen 60 bis 70 Zeichen.

Gibt es irgendeine Delphi- oder Windowsfunktion, sodass der Quote in er Textdatei nicht escaped werden muss und in Delphi trotzdem korrekt interpretiert wird?

Uwe Raabe 17. Jun 2019 23:40

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Zitat von DieDolly (Beitrag 1434881)
Ich lese Text aus einer Datei, der dann in meinem Programm angezeigt wird.

Wie denn genau?

DieDolly 18. Jun 2019 10:17

AW: Text aus Datei laden, Single Quote Problem
 
Genau genommen ist es eine INI-Datei. Dort stehen Worte und Sätze so drin, wie sie in der jeweiligen Sprache geschrieben werden. Also kein Escapen oder so.
\' und '''' in der INI-Datei, wie man es bei PHP zum Beispiel macht, habe ich schon versucht.

Uwe Raabe 18. Jun 2019 10:20

AW: Text aus Datei laden, Single Quote Problem
 
Die Frage ist: Wie liest du den Text aus der Datei? Es gibt einen ganzen Haufen von Möglichkeiten und jede hat ihre Eigenarten.

DieDolly 18. Jun 2019 10:25

AW: Text aus Datei laden, Single Quote Problem
 
Hier ein Beispiel
Delphi-Quellcode:
function ReadValue(const AIniFile: TMemIniFile; const Section, Ident: string): string;
begin
 Result := UTF8ToWideString(AIniFile.ReadString(Section, Ident, ''));
end;

LIni := TMemIniFile.Create(LanguageFile);
try
 String123456 := ReadValue(LIni, 'section', 'ident');
finally
 LIni.Free;
end;
Ich jage alles durch ReadValue, um doppelten Code zu vermeiden. UTF8ToWideString steht da, da sonst Umlaute nicht richtig angezeigt werden.

Moombas 18. Jun 2019 10:26

AW: Text aus Datei laden, Single Quote Problem
 
@Dolly: Wenn ich dich richtig verstehe ist nicht das einlesen das Problem (der eingelesene Text entspricht 1:1 dem was du aus der Datei erwartest), sondern die spätere Verarbeitung wenn ein
Code:
'
im Text auftaucht. Richtig?

Wäre es dann nicht eine Option die
Code:
'
durch Leerzeichen zu ersetzen (z.B. mittels Stringreplace)?

DieDolly 18. Jun 2019 10:32

AW: Text aus Datei laden, Single Quote Problem
 
Das Ergebnis stimmt. Aber intern passiert irgendwas bzw passiert irgendwas nicht denn in einem Message Dialog wird die Zeile nicht mehr automatisch umgebrochen, wenn ein ' im String ist. Wenn ich den String hardcoded selbst reinschreibe und '' statt ' verwende klappt alles. Aber ein '' in der Ini-Datei bringt nicht das Resultat wie der hardcoded string.

Durch Leerzeichen ersetzen ist nicht machbar. Es handelt sich um Übersetzungen.

Neutral General 18. Jun 2019 10:38

AW: Text aus Datei laden, Single Quote Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
MessageDlg('Test und don''t und son ein mustn''t und bla und Test aber auch ein Test ist mit einem ''Test'' sehr don''t', mtInformation, [mbOK], 0);


https://www.delphipraxis.net/attachm...1&d=1560850673

Hab damit keine Probleme

DieDolly 18. Jun 2019 10:39

AW: Text aus Datei laden, Single Quote Problem
 
Du hast den Text ja auch hardcoded im Programm drin.

Ließ genau diesen aus einer Ini-Datei aus. Das Ergebnis sollte ein anderes sein.

Neutral General 18. Jun 2019 10:42

AW: Text aus Datei laden, Single Quote Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir das gleich Ergebnis:
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
var ini: TIniFile;
    str: String;
begin
  ini := TIniFile.Create('D:\Test123.ini');
  try
//    ini.WriteString('TEST', 'Str', 'Test und don''t und son ein mustn''t und bla und Test aber auch ein Test ist mit einem ''Test'' sehr don''t');

    str := ini.ReadString('TEST', 'Str', '');
   // str := UTF8ToWideString(ini.ReadString('TEST', 'Str', '')); <--- geht auch
    MessageDLg(Str, mtInformation, [mbOK], 0);
  finally
    ini.Free;
  end;
end;
https://www.delphipraxis.net/attachm...1&d=1560850977

DieDolly 18. Jun 2019 10:43

AW: Text aus Datei laden, Single Quote Problem
 
Es sei n och erwähnt, dass ich CreateMessageDialog verwende.

Delphi-Quellcode:
MsgStr := WrapText(AText, sLineBreak, ['.', ' ', #9, '-'], 75);
 MsgDlg := CreateMessageDialog(MsgStr, MsgDlgType, MsgDlgBtn, MsgDlgBtnDef);
Nach 75 Zeichen sollte eigentlich umgebrochen werden. Es wird aber eine ungefähr 135 Zeichen lange Zeile angezeigt.
Ohne irgendein ' im String wird auch richtig umgebrochen.

Wenn ich ein '' in die Datei schreibe wird korrekt umgebrochen. Aber dann wird auch ein '' angezeigt. Mit StringReplace das '' durch ' austauschen führt zum ursprünglichen Problem.

Moombas 18. Jun 2019 11:05

AW: Text aus Datei laden, Single Quote Problem
 
Könnte es mit deiner Umwandlung (UTF8ToWideString) zu tun haben?

Uwe Raabe 18. Jun 2019 11:09

AW: Text aus Datei laden, Single Quote Problem
 
Der Kommentar zu WrapText in System.SysUtils sagt aber auch:
Zitat:

{ WrapText will scan a string for BreakChars and insert the BreakStr at the
last BreakChar position before MaxCol. Will not insert a break into an
embedded quoted string (both ''' and '"' supported) }
Es sollte also funktionieren, wenn du jeden der Single-Quotes verdoppelst.

DieDolly 18. Jun 2019 11:09

AW: Text aus Datei laden, Single Quote Problem
 
Ich habe gehofft es liegt daran. Aber daran liegt es leider nicht.
Das scheint irgendein tiefliegenderes Problem mit dem CreateMessageDialog zu sein. Von CreateMessageDialog kann ich leider nicht weg.

Wenn ich die Single Quotes verdopplte, dann wird korrekt umgebrochen. Aber dann sehe ich im Resultat auch doppelte Quotes.

Schokohase 18. Jun 2019 11:12

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Zitat von DieDolly (Beitrag 1434927)
Ich habe gehofft es liegt daran. Aber daran liegt es leider nicht.
Das scheint irgendein tiefliegenderes Problem mit dem CreateMessageDialog zu sein. Von CreateMessageDialog kann ich leider nicht weg.

Wenn ich die Single Quotes verdopplte, dann wird korrekt umgebrochen. Aber dann sehe ich im Resultat auch doppelte Quotes.

Dein Problem liegt in der Funktion
Delphi-Quellcode:
WrapText
und nirgendwo anders.

Also, entweder vor dem WrapText die Quotes verdoppeln und danach wieder das Verdoppeln rückgängig machen oder eine andere WrapText verwenden/schreiben.

Schaust du dir eigentlich niemals an, was du in die Funktionsaufrufe übergibst? Dann wäre dir sofort aufgefallen, dass die Umbrüche beim Aufruf von CreateMessageDialog fehlen und es also daran nicht liegen kann.

DieDolly 18. Jun 2019 11:17

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Also, entweder vor dem WrapText die Quotes verdoppeln und danach wieder das Verdoppeln rückgängig machen oder eine andere WrapText verwenden/schreiben.

Schaust du dir eigentlich niemals an, was du in die Funktionsaufrufe übergibst? Dann wäre dir sofort aufgefallen, dass die Umbrüche beim Aufruf von CreateMessageDialog fehlen und es also daran nicht liegen kann.
Wieso fährst du mich denn jetzt so an?

Zitat:

dass die Umbrüche beim Aufruf von CreateMessageDialog fehlen und es also daran nicht liegen kann.
Die Umbrüche existieren absichtlich nicht. Was denkst du, warum ich WrapText verwende.

Delphi-Quellcode:
 MsgStr := StringReplace(MsgStr, #39, #39#39, [rfReplaceAll]);
 MsgStr := WrapText(MsgStr, sLineBreak, ['.', ' ', #9, '-'], 75);
 MsgStr := StringReplace(MsgStr, #39#39, #39, [rfReplaceAll]);
Das dauert zum Glück nicht einmal 1 Millisekunde bei mir. Ich hatte mit dem Schlimmsten gerechnet. Ist zwar umständlich aber funktioniert.

Schokohase 18. Jun 2019 11:25

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Zitat von DieDolly (Beitrag 1434930)
Zitat:

dass die Umbrüche beim Aufruf von CreateMessageDialog fehlen und es also daran nicht liegen kann.
Die Umbrüche existieren absichtlich nicht. Was denkst du, warum ich WrapText verwende.

Aber genau das ist doch das Problem.

Du willst vor dem Aufruf von
Delphi-Quellcode:
CreateMessageDialog
aktiv Zeilenumbrüche mit
Delphi-Quellcode:
WrapText
in den Text hineinbringen.
Du vermisst Zeilenumbrüche im MessageDialog.

Und da kommst du nicht auf die Idee, zu schauen, was bei
Delphi-Quellcode:
WrapText
denn so herauskommt, also dem Dingen, was da Zeilenumbrüche reinbringen soll?

Das lässt mich nur etwas den Kopf schütteln.

DieDolly 18. Jun 2019 11:49

AW: Text aus Datei laden, Single Quote Problem
 
Es können nun einmal nicht alle so perfekt sein wie du. Nun aber Ende im Gelände.

p80286 18. Jun 2019 21:27

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Zitat von Schokohase (Beitrag 1434932)
Und da kommst du nicht auf die Idee, zu schauen, was bei
Delphi-Quellcode:
WrapText
denn so herauskommt, also dem Dingen, was da Zeilenumbrüche reinbringen soll?

Ich würde das über das fragliche Zeichen angehen.
1) Was ist denn der Hex-Wert des Zeichens? im verwendeten Zeichensatz!
2) Welche(s) Zeichen (Hex-Wert)/Zeichensatz verhindert den angestrebten Umbruch?
3) Gibt es ein Escape-Zeichen?

Ok ist ganz schön korinthenkackerisch, aber exakt! Und bei der teilweise kreativen Darstellung von Zeichen durch verschiedene Fonts absolut notwendig.

Gruß
K-H

DieDolly 18. Jun 2019 21:48

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Ich würde das über das fragliche Zeichen angehen.
1) Was ist denn der Hex-Wert des Zeichens? im verwendeten Zeichensatz!
2) Welche(s) Zeichen (Hex-Wert)/Zeichensatz verhindert den angestrebten Umbruch?
3) Gibt es ein Escape-Zeichen?
Verstehe ich nicht. Ein Escapezeichen gibt es nicht.
In welchem Zeichensatz das ' ist weiß ich nicht.

gast2019 19. Jun 2019 04:24

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Zitat von DieDolly (Beitrag 1434912)
Genau genommen ist es eine INI-Datei. Dort stehen Worte und Sätze so drin, wie sie in der jeweiligen Sprache geschrieben werden. Also kein Escapen oder so.
\' und '''' in der INI-Datei, wie man es bei PHP zum Beispiel macht, habe ich schon versucht.

Zeig doch mal eine Zeile der INI-Datei, die Ärger macht.

DieDolly 19. Jun 2019 10:51

AW: Text aus Datei laden, Single Quote Problem
 
Nicht die Datei macht ärger sondern einzelne Werte da drin. Beispiele stehen schon im ersten Beitrag.

Das Problem wurde aber schon gehoben. WrapText kam mit dem ' nicht klar. Schade, dass ich jetzt alle ' erst verdoppel muss, nur um sie danach wieder zu normalisieren.

p80286 19. Jun 2019 12:47

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Zitat von DieDolly (Beitrag 1435013)
Nicht die Datei macht ärger sondern einzelne Werte da drin. Beispiele stehen schon im ersten Beitrag.

Das Problem wurde aber schon gehoben. WrapText kam mit dem ' nicht klar. Schade, dass ich jetzt alle ' erst verdoppel muss, nur um sie danach wieder zu normalisieren.

Na dann ist ja gut. Das Verdoppeln kannst Du ja beim Einlesen erledigen.
Mein Hinweis aus #19 wenn ein Zeichen z.b. ' angezeigt/gedruckt wird, dann kann es sich um ein "falsches" Zeichen
handeln.
Siehe hierzu https://de.wikipedia.org/wiki/Apostroph oder https://de.wikipedia.org/wiki/ISO_8859

So wurdenz.B. die {} in TP Sourcen auf CP/M Rechnern als Ü Ö angezeigt. Diesen Effekt kann man sich zu Nutze machen indem man ein Zeichen nutzt, das zwar aussiht wie ein Hochkomma aber einen anderen Wert bestzt.

Gruß
K-H

Amateurprofi 19. Jun 2019 13:28

AW: Text aus Datei laden, Single Quote Problem
 
Zitat:

Zitat von DieDolly (Beitrag 1435013)
Nicht die Datei macht ärger sondern einzelne Werte da drin. Beispiele stehen schon im ersten Beitrag.

Das Problem wurde aber schon gehoben. WrapText kam mit dem ' nicht klar. Schade, dass ich jetzt alle ' erst verdoppel muss, nur um sie danach wieder zu normalisieren.

Na ja, WrapText kommt mit dem ' schon klar.
Wie schon von Uwe weiter oben deutlich gemacht, setzt WrapText keinen Break innerhalb von Quotes ( ' oder " ).
Jetzt stößt WrapText in "Deinem" Text auf ein Quote.
Da er innerhalb von Quotes kein Break setzen darf, sucht er das nächste Quote, in der Absicht den in ' stehenden Teil zu überspringen. Das wird dann aber bei "Deinen" Texten i.d.R. nicht gefunden.
Also nicht "WrapText kommt nicht klar" sondern "Du benutzt eine Funktion für etwas, für das sie nicht gemacht ist".

Vielleicht wäre es besser, ein eigenes WrapText zu verwenden, das Quotes nicht als Ein-/Ausleitung eines Textteils betrachtet sondern so behandelt, wie alle anderen Zeichen.
Zum Beispiel so:
(Auf die Schnelle getippt und nicht ausgiebig getestet).
Delphi-Quellcode:
FUNCTION WrapText(const Line,BreakStr:String; const BreakChars:TSysCharSet;
                  MaxCol:Integer):String;
var I,J,K,Len:Integer;
begin
   Len:=Length(Line);
   if Len<=MaxCol then Exit(Line);
   Result:='';
   I:=1;
   J:=MaxCol;
   repeat
      K:=J;
      while (J>I) and not CharInSet(Line[J],BreakChars) do Dec(J);
      if J=I then begin
         J:=K;
         while (J<Len) and not CharInSet(Line[J],BreakChars) do Inc(J);
      end;
      // J zeigt auf Break oder auf letztes Zeichen in Line
      if Result<>'' then Result:=Result+BreakStr;
      Result:=Result+Copy(Line,I,J-I+1);
      I:=J+1;
      Inc(J,MaxCol);
   until J>=Len;
   if I>Len then Exit;
   if Result<>'' then Result:=Result+BreakStr;
   Result:=Result+Copy(Line,I,MaxInt);
end;

Luckie 19. Jun 2019 17:24

AW: Text aus Datei laden, Single Quote Problem
 
Um es noch mal an einem Beispiel zu verdeutlichen:
Zitat:

don't ganz viel Text ohne Hochkomata can't
Wraptext deutet jetzt alles von 't ganz viel Text ohne Hochkomata can' als wörtliche Rede und bricht innerhalb nicht um.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz