Umwandlung einer Zeichenkette -> Ascii Zeichen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Umwandlung einer Zeichenkette -> Ascii Zeichen

Beitrag von Vbxler »

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
-------------------------

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Beitrag von Socke »

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

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Beitrag von wp_xyz »

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]);

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Beitrag von Vbxler »

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: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Beitrag von Vbxler »

Das mit dem eigenen Datentyp funktioniert bestens.
Vielen Dank für den Tipp, wieder was neues gelernt.
Vbxler
-------------------------

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Umwandlung einer Zeichenkette -> Ascii Zeichen

Beitrag von theo »

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.

Antworten