![]() |
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:
Zitat:
Gibt es irgendeine Delphi- oder Windowsfunktion, sodass der Quote in er Textdatei nicht escaped werden muss und in Delphi trotzdem korrekt interpretiert wird? |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
|
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. |
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.
|
AW: Text aus Datei laden, Single Quote Problem
Hier ein Beispiel
Delphi-Quellcode:
Ich jage alles durch ReadValue, um doppelten Code zu vermeiden. UTF8ToWideString steht da, da sonst Umlaute nicht richtig angezeigt werden.
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; |
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)?
'
|
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. |
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 |
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. |
AW: Text aus Datei laden, Single Quote Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir das gleich Ergebnis:
Delphi-Quellcode:
https://www.delphipraxis.net/attachm...1&d=1560850977
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; |
AW: Text aus Datei laden, Single Quote Problem
Es sei n och erwähnt, dass ich CreateMessageDialog verwende.
Delphi-Quellcode:
Nach 75 Zeichen sollte eigentlich umgebrochen werden. Es wird aber eine ungefähr 135 Zeichen lange Zeile angezeigt.
MsgStr := WrapText(AText, sLineBreak, ['.', ' ', #9, '-'], 75);
MsgDlg := CreateMessageDialog(MsgStr, MsgDlgType, MsgDlgBtn, MsgDlgBtnDef); 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. |
AW: Text aus Datei laden, Single Quote Problem
Könnte es mit deiner Umwandlung (UTF8ToWideString) zu tun haben?
|
AW: Text aus Datei laden, Single Quote Problem
Der Kommentar zu WrapText in System.SysUtils sagt aber auch:
Zitat:
|
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. |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
Delphi-Quellcode:
und nirgendwo anders.
WrapText
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. |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
Zitat:
Delphi-Quellcode:
Das dauert zum Glück nicht einmal 1 Millisekunde bei mir. Ich hatte mit dem Schlimmsten gerechnet. Ist zwar umständlich aber funktioniert.
MsgStr := StringReplace(MsgStr, #39, #39#39, [rfReplaceAll]);
MsgStr := WrapText(MsgStr, sLineBreak, ['.', ' ', #9, '-'], 75); MsgStr := StringReplace(MsgStr, #39#39, #39, [rfReplaceAll]); |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
Du willst vor dem Aufruf von
Delphi-Quellcode:
aktiv Zeilenumbrüche mit
CreateMessageDialog
Delphi-Quellcode:
in den Text hineinbringen.
WrapText
Du vermisst Zeilenumbrüche im MessageDialog. Und da kommst du nicht auf die Idee, zu schauen, was bei
Delphi-Quellcode:
denn so herauskommt, also dem Dingen, was da Zeilenumbrüche reinbringen soll?
WrapText
Das lässt mich nur etwas den Kopf schütteln. |
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.
|
AW: Text aus Datei laden, Single Quote Problem
Zitat:
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 |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
In welchem Zeichensatz das ' ist weiß ich nicht. |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
|
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. |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
Mein Hinweis aus #19 wenn ein Zeichen z.b. ' angezeigt/gedruckt wird, dann kann es sich um ein "falsches" Zeichen handeln. Siehe hierzu ![]() ![]() 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 |
AW: Text aus Datei laden, Single Quote Problem
Zitat:
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; |
AW: Text aus Datei laden, Single Quote Problem
Um es noch mal an einem Beispiel zu verdeutlichen:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz