Umwandlung einer Zeichenkette -> Ascii Zeichen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Umwandlung einer Zeichenkette -> Ascii Zeichen

Beitragvon Vbxler » 27. Okt 2019, 22:07 Umwandlung einer Zeichenkette -> Ascii Zeichen

Hallo Leute,

eine Frage zur Umwandlung einer Zeichenkette -> Ascii Zeichen.
Ich gebe ein Wort in einem TEdit Control ein, speichere die in einem String.
Das Wort möchte ich in die einzelnen Zeichen zerlegen und mit den selben Buchstaben
ein neues Wort für ein Rätselspiel neu zusammenstellen.
Das funktioniert erstmals auch gut, solange kein Umlaut im Spiel ist.
Daher wollte ich die Eingabe mithilfe der Funktion Utf8ToAnsi in Ansi-Zeichen
umwandeln, jedoch funktioniert das, so wie ich es mache, nicht. Wenn ich ''Für' eingebe
habe ich vor der Funktion Utf8ToAnsi 4 Zeichen in der Zeichenkette und auch nach der Umwandlung.
Das 'ü' besteht aus den Ordinalzahlen $C3 und $BC, wie es eben in UTF8 verwendet ist.
Code: Alles auswählen
sErgebnis           : String = '';
sEingabe            : AnsiString = '';
iEingabe            : Integer = 0;
 
sErgebnis := txtEingangswort.Text;
iEingabe  := Length(sErgebnis);
 
sEingabe := Utf8ToAnsi(sErgebnis);    //<- Das hat keinen Effekt
iEingabe := Length(sEingabe);   
Kann mir vielleicht jemand kurz zeigen, wie ich das richtig in Ascii-Zeichen umwandeln kann.

Danke
Vbxler
-------------------------
Vbxler
 
Beiträge: 109
Registriert: 25. Mai 2013, 06:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Socke » 27. Okt 2019, 22:21 Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Was ist denn dein Ziel? Wie verwendest du die Zeichencodes weiter?

Wenn du zu jedem Zeichen nur einen Code haben möchtest, müsstest du den Unicode Code Point ermitteln. Siehe hierzu: Showing codepoints with UTF8CharacterToUnicode
Ein Code Point passt immer in ein 4 Byte Integer.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
Lazarusforum e. V.
 
Beiträge: 2661
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon wp_xyz » 28. Okt 2019, 00:45 Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

UTF8ToAnsi funktioniert seit FPC3.0 für Stringkonvertierungen in Lazarus nicht mehr. Nimm stattdessen eine spezifische Konvertierungsfunktion wie UTF8ToWinCP aus der Unit LazUTF8 oder UTF8ToCP1252 aus der Unit LConvEncoding

Code: Alles auswählen
var
  sErgebnis: String;
  sEingabe: String;
begin
  sEingabe := UTF8ToCP1252(sErgebnis);

oder deklariere für den String sEingabe einen eigenen Typ als AnsiString mit der Codepage 1252, dann kann FPC die Konvertierung automatisch durchführen, und du musst selbst keine explizite Konvertierungsfunktion mehr aufrufen:

Code: Alles auswählen
type
  CP1252String = type AnsiString(1252);
var
  sErgebnis: String;
  sEingabe: CP1252String;
begin
  sEingabe := sErgebnis;   // <--- einfache Zuweisung bewirkt Konvertierung

Beachte aber, dass sEingabe in LCL-GUI-Elementen nicht korrekt angezeigt werden, es ist ja kein UTF8-kodierter String mehr. Wenn du also ein Zeichen aus sEingabe herausgetrennt hast, musst du dieses wieder nach UTF8 zurückkonvertieren, damit es von Lazarus richtig dargestellt wird.

Code: Alles auswählen
// für sErgebnis = 'für'
  Edit1.Text := WinCPToUTF8(sEingabe[2]);
wp_xyz
 
Beiträge: 3070
Registriert: 8. Apr 2011, 08:01

Beitragvon Vbxler » 28. Okt 2019, 08:19 Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Hallo und vielen Dank für die Antworten.
Das mit der Erstellung eines eigenen Typen in AnsiString klingt ja
sehr interessant. Das werde ich gleich bei Gelegenheit testen.

Melde mich wieder wenn ich ein Ergebnis habe.
Vbxler
-------------------------
Vbxler
 
Beiträge: 109
Registriert: 25. Mai 2013, 06:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1) | 
CPU-Target: 32Bit
Nach oben

Beitragvon Vbxler » 28. Okt 2019, 08:50 Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Das mit dem eigenen Datentyp funktioniert bestens.
Vielen Dank für den Tipp, wieder was neues gelernt.
Vbxler
-------------------------
Vbxler
 
Beiträge: 109
Registriert: 25. Mai 2013, 06:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1) | 
CPU-Target: 32Bit
Nach oben

Beitragvon theo » 28. Okt 2019, 10:58 Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Ich sehe hier eigentlich keinen Grund, auf eine 8-Bit-Zeichenkodierung zu reduzieren.
Warum nicht WideString/UnicodeString verwenden?
Dann funktioniert das Rätselspiel auch gleich für Russisch etc. ohne Zusatzaufwand.
theo
 
Beiträge: 8238
Registriert: 11. Sep 2006, 18:01

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste

porpoises-institution
accuracy-worried