Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 287
Erhaltene Danke: 12



BeitragVerfasst: Mi 05.02.25 00:22 
Hallo zusammen
Schreibt man in Word eine wörtliche Rede, dann wird das Hochkomma am Textanfang und Textende automatisch konvertiert in ein tiefstehendes und ein hochstehendes Zeichen. Ich wollte diese Zeichen ersetzen in « und » . Zu meiner Verwunderung meldet Word die richtige Anzahl gefundener Zeichen, ersetzt sie aber nicht. Nun habe ich den Text in meinen eigenen Editor kopiert und untersucht.
Ergebnis: in Word ist das kleingestellte Anführungszeichen („) ein Unicode-Zeichen (Dez=8222) und das Schlusszeichen (“) ebenfalls ein Unicodezeichen (Dez 8220).

Mein Editor ist ein Richedit-Object. Da Delphi 12 mehrere Konvertierungsroutinen kennt, hoffte ich auf eine fertige Procedure im Sinne wie folgt.
ausblenden Delphi-Quelltext
1:
2:
Richedit1.text := UnicodeToUtf8(Richedit1.Text);  //oder
Richedit1.text := UnicodeToAnsi(Richedit1.Text);

In der Hilfe finde ich aber nur eine Funktion
ausblenden Delphi-Quelltext
1:
function UnicodeToUtf8(Dest: _PAnsiChr; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal;					

Kann mir jemand zur helfen, wie ich den Richtext in die Funktion einbinde?
Danke hRb

PS: Ich habe schon eine Konvertierungsprocedure im Programm und hoffte auf ähnlich einfache Umsetzung
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var
  encod : TEncodetype;
begin with Richedit1 do
  begin
    encod := DetectUTF8Encoding(text);
    case encod of
      etUSASCII: Text := AnsiToUtf8(text); // UTF8String;
      etUTF8:    if IsUTF8String(text) then
                   Putalarm('Dies ist schon UTF8-codierter Text.');
      etANSI:    Text := AnsiToUtf8(text); // UTF8String;
      else       begin Putalarm ('Dies ist kein ANSI-codierter Text.  ABBRUCH'); exit; end;
    end;
...

  end;
end;
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 05.02.25 07:34 
Wenn ich dich richtig verstehe, dann soll deine UnicodeToUTF8 Funktion in einem Text die („) durch ein («) ersetzen. Das wird nicht funktionieren. Oder würdest du erwarten, dass so eine Funktion auch alle (ä) durch (a) ersetzt?

Die beiden Zeichen („) und («) sind ja beides Unicode-Zeichen, mit dem Unterschied, dass («) in dem hier (zumindest früher mal) gebräuchlichen ISO-8859-1-Zeichensatz in 1 Byte passt, und („) darin gar nicht vorkommt. Deine Funktion würde nur die interne Darstellung im Bytestrom von 0x82 0x22 zu 0xE8 0x88 0xA2 ändern. Das Zeichen selbst würde sich nicht ändern.

Dass Word sich weigert, die Gänsefüßchen so zu setzen, wie du es haben willst, dürfte an einer Autokorrektur-Funktion im Kontext des Gebietsschemas liegen. Das ist kein Ansi/Unicode-Problem.

Oder anders: Nutze einfach StringReplace in Delphi. ;-)

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 05.02.25 12:01 
Warum schreibst du denn die Guillemets nicht direkt, wenn du diese verwenden möchtest? In einigen Sprachen werden diese ja für wörtliche Rede verwendet, so dass Word die natürlich kennt.

Du kannst auch eine Autokorrektur-Regel schreiben, die << durch « ersetzt und >> analog, wenn du die Zeichen nicht direkt schreiben möchtest (Alt + 174 bzw. Alt + 175):
Guillemets

Bezüglich der automatischen Ersetzung gibt es übrigens die Option:
Zitat:
"Gerade" Anführungszeichen durch “typografische” ersetzen
Einloggen, um Attachments anzusehen!
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 287
Erhaltene Danke: 12



BeitragVerfasst: Do 06.02.25 00:55 
Hallo jaenicke,
Zitat:
Warum schreibst du denn die Guillemets nicht direkt,

Der Text wurde nicht selbst geschrieben. Ich habe ihn von meinem Bruder erhalten, der seinerseits die Textteile eingescannt und mit OCR-Software nach Word konvertiert hat. Ich habe nur bemerkt, dass Word diese Zeichen auch verwendet, wenn man direkt in Word schreibt. Deine Anregung gilt natürlich, suche jedoch für mein Programm eine Softwarelösung.
hRb
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 287
Erhaltene Danke: 12



BeitragVerfasst: Do 06.02.25 01:45 
Hallo Gausi
ich habe in meinem Programm u.a. einen Kommandointerpreter realisiert. Ich kann eine große Menge an Funktionen als Kommando ausführen. Entweder in einer Kommandozeile oder als Button. So auch zum Suchen und Ersetzen (Tauschen). Ein solches Kommado lautet z.B,
t'Johann'Johannes'  //Johann wird gegen Johannes getauscht
Bedeutung: t= Kommando Tauschen. Es wird nach String1 gesucht und durch String2 ersetzt. String1 / 2 wird durch Hochkomma getrennt (Hochkomme darf in String nicht vorkommen, sonst muss man ein beliebig anders Zeichen benutzen das nicht im String vorkommt).
String kann auch ein einzelnes Zeichen sein. Beim Such-String1 ist es gleich ob klein- oder groß-geschrieben.
Setzt man das ganze in spitze Klammern, kann man einen Wiederholfaktor angeben, z,B.
10<t'a'A'> // Hiermit würden die ersten 10 gefundenen a durch große A ersetzt.
Leider funktioniert diese Funktion bisher nur im ANSI_Code-Tabelle (0 .. 255). Ich hatte die Hoffnung, dass mit einer Codewandlungsroutine von Unicode auf ANSI das obige Problem leicht zu lösen ist.
Nun verständlich?
PS: wie zu sehen enthät der ANSI-Zeichensatz die gewünschten Symbole. Meine Zeichen wären Dez 171 und 187.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
ANSICODE > 127:
 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯     Die Zeichen können eingegeben werden mit ALT + 4-stellige Dez-Zahl am Nummernblock
                     Beachte: 3-stellige Eingaben (ohne führende Null) liefern andere Zeichen!
 HEX  | #.0 | #.1 | #.2 | #.3 | #.4 | #.5 | #.6 | #.7 | #.8 | #.9 | #.A | #.B | #.C | #.D | #.E | #.F |
 ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  DEZ |0128 |0129 |0130 |0131 |0132 |0133 |0134 |0135 |0136 |0137 |0138 |0139 |0140 |0141 |0142 |0143 |
 #8.  |  €  |    |  ‚  |  ƒ  |  „  |  …  |  †  |  ‡  |  ˆ  |  ‰  |  Š  |  ‹  |  Œ  |    |  Ž  |    |
  DEZ |0144 |0145 |0146 |0147 |0148 |0149 |0150 |0151 |0152 |0153 |0154 |0155 |0156 |0157 |0158 |0159 |
 #9.  |    |  ‘  |  ’  |  "  |  "  |  •  |  -  |  -  |  ˜  |  ™  |  š  |  ›  |  œ  |    |  ž  |  Ÿ  |
  DEZ |0160 |0161 |0162 |0163 |0164 |0165 |0166 |0167 |0168 |0169 |0170 |0171 |0172 |0173 |0174 |0175 |
 #A.  |     |  ¡  |  ¢  |  £  |  ¤  |  ¥  |  ¦  |  §  |  ¨  |  ©  |  ª  |  «  |  ¬  | DEL |  ®  |  ¯  |
  DEZ |0176 |0177 |0178 |0179 |0180 |0181 |0182 |0183 |0184 |0185 |0186 |0187 |0188 |0189 |0190 |0191 |
 #B.  |  °  |  ±  |  ²  |  ³  |  ´  |  µ  |  ¶  |  ·  |  ¸  |  ¹  |  º  |  »  |  ¼  |  ½  |  ¾  |  ¿  |
  DEZ |0192 |0193 |0194 |0195 |0196 |0197 |0198 |0199 |0200 |0201 |0202 |0203 |0204 |0205 |0206 |0207 |
 #C.  |  À  |  Á  |  Â  |  Ã  |  Ä  |  Å  |  Æ  |  Ç  |  È  |  É  |  Ê  |  Ë  |  Ì  |  Í  |  Î  |  Ï  |
  DEZ |0208 |0209 |0210 |0211 |0212 |0213 |0214 |0215 |0216 |0217 |0218 |0219 |0220 |0221 |0222 |0223 |
 #D.  |  Ð  |  Ñ  |  Ò  |  Ó  |  Ô  |  Õ  |  Ö  |  ×  |  Ø  |  Ù  |  Ú  |  Û  |  Ü  |  Ý  |  Þ  |  ß  |
  DEZ |0224 |0225 |0226 |0227 |0228 |0229 |0230 |0231 |0232 |0233 |0234 |0235 |0236 |0237 |0238 |0239 |
 #E.  |  à  |  á  |  â  |  ã  |  ä |  å   |  æ  |  ç  |  è  |  é  |  ê  |  ë  |  ì  |  í  |  î  |  ï  |
  DEZ |0240 |0241 |0242 |0243 |0244 |0245 |0246 |0247 |0248 |0249 |0250 |0251 |0252 |0253 |0254 |0255 |
 #F.  |  ð  |  ñ  |  ò  |  ó  |  ô  |  õ  |  ö  |  ÷  |  ø  |  ù  |  ú  |  û  |  ü  |  ý  |  þ  |  ÿ  |


Hab nochmals in Word nachgesehen. Diese Zeichen sind bei mir nicht in der Auotkorrektur enthalten. Oder funktioniert es bei Dir?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 06.02.25 09:30 
Wenn dein Kommando-Interpreter nur ANSI kann, dann wirst du an der Stelle nicht weiterkommen. Ganz egal wie du versuchst, vorher die Kodierung zu ändern. Das Zeichen („) ist in ANSI nicht darstellbar, also kann dein Interpreter das nicht finden. Wenn du das ändern willst, brauchst du Tools, die mehr als ANSI können - was ja bei Delphi seit Version 2009 mit dem Standard-String der Fall ist.

Zu Word: "Autokerrektur" meinte ich in einem erweiterten Sinne. Sebastian hat da glaube ich das richtige Stichwort geliefert mit der Option "Gerade" Anführungszeichen durch “typografische” ersetzen.

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 06.02.25 10:54 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Hab nochmals in Word nachgesehen. Diese Zeichen sind bei mir nicht in der Auotkorrektur enthalten. Oder funktioniert es bei Dir?
Ich habe sie hinzugefügt. Dehalb habe ich ja geschrieben, dass du eine Regel schreiben kannst.

Auch per suchen und ersetzen klappt das bei mir problemlos, wenn ich die automatische Korrektur der Anführungszeichen mit der genannten Option ("Gerade" Anführungszeichen durch “typografische” ersetzen) deaktiviere. Standardmäßig ersetzt Wort schlicht « und » direkt nach dem Ersetzen wieder durch typografische deutsche Anführungszeichen.

Aber wenn du das ohnehin per Programm umsetzen möchtest, spielt das ja keine Rolle. Dann musst du aber auch Unicode verwenden. Entweder in Form einer aktuellen Delphiversion oder indem du z.B. mit WideString arbeitest. Wenn du aber heute allgemein Texte verarbeiten möchtest, geht ohnehin kein sinnvoller Weg an einer aktuellen Delphiversion vorbei. Und dann kannst du ganz normal Unicodezeichen verwenden.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 287
Erhaltene Danke: 12



BeitragVerfasst: Sa 08.02.25 01:32 
Danke für all die hilfreichen Tipps.
Will der Reihe nach antworten:
1. die Erwähnung meinerseits, auf Texte in Word, hat ein wenig zu einem Nebenschauplatz geführt und meine Eingangsfrage (s. Codebeispiele) in den Hintergrund gedrängt:
Richedit.Text := UnicodeToUtf8(Richedit1.Text) ???, alternativ zur
Function UnicodeToUtf8(Dest: _PAnsiChr; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal;
Zum Thema Word habe ich alles gelesen, verstanden und selbst getestet. Ist somit für mich abgeschlossen.
2. Mein Editor arbeitet selbstverständlich als Richedit-Objekt mit string und kann damit sowohl ANSI, Utf8 und Unicode-Zeichen darstellen, sonst hätte ich die einkopierten Wordtexte ja nicht korrekt gesehen. Habe im Editor auch eine Funktion zur Anzeige des Zeichens am Curser (dezimale und hexa-schreibweise) und habe somit den Unicode erkannt.
3. Ja, mein Kommandointerpreter ist noch vom "alten Schlag" und sucht nur im Zeichenbereich von 0..255. Hat mir auch einen Laufzeiterror geliefert beim Tauschversuch des Wordtextes. Daher die Idee der Codewandlung, denn die gewünschten Zeichen « und » sind, wie oben schon erwähnt, im ANSI-zeichensatz enthalten. Habe den Error im Interpreter nun abgefangen.
4. Als Alternative habe ich ins Programm einen TFindDialog und einen TReplacedialog eingebaut. Und siehe da, hier läuft die Tauschfunktion wie gewollt. Problem ist damit im Prinzip gelöst!!! Allerdings habe ich dort ein anderes Problem mit dem Einfügen der Sonderzeichen. Dies ist jedoch eine zweite Frage, die ich getrennt einreiche. (morgen)
Gruß und Dank. hRb
PS: werde die Idee der Codekonvertierung jetzt wohl ablegen. Es sei denn jemand hat eine einfache Befehlsfolge zur Codekonvertierung. Vielleicht ist's für jemand anderen hilfreich.