Unicode Escape Sequences in AnsiString konvertieren

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Unicode Escape Sequences in AnsiString konvertieren

Beitrag von m.fuchs »

Hallo,

ich verzweifle irgendwie daran einen String der Unicode Escapsequenzen enthält
in einen Ansistring zu konvertieren:

Milch f\u00fcr alle => Milch für alle

Kennt da jemand eine Funktionen in Freepascal (RTL/FCL/LCL)?


mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von mschnell »

1) Warum willst Du das ? Das aktuelle Lazarus sollte ohnehin komplett mit Unicode arbeiten. (Was daran funktioniert, bzw. nicht so funktioniert, wie man(cher) sich das vorstellt, ist in diversen Threads hier diskutiert worden)

2) Im aktuellen Lazarus (sprich FPC) wird Text im Unicode- UTF8-Format im Stringtyp AnsiString gespeichert. Das ist von der Benamsung zwar widersinnig, wird sich aber erst mit der zukünftigen FPC-Version mit Strings, die ihre interne Codierung dynamisch verwalten, ändern. Die Fragestellung "Unicode Escape Sequences in AnsiString konvertieren" ist also so nicht zu beantworten.

3) Vermutlich meinst Du "UTF8 codierte Byte-Folge in ANSI(Westeuropa)-codierten Byte-Folge umcodieren". Soweit ich weiß gibt es tatsächlich in der RTL der neusten Lazarus-Verison Funktionen dafür (ich habe hier leider nur die alte nicht-Unicode Version).

Gruß,
-Michael

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

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von theo »

mikescu hat geschrieben: Kennt da jemand eine Funktionen in Freepascal (RTL/FCL/LCL)?
Mir nicht bekannt.
Das ist aber nicht wirklich ein Grund zum Verzweifeln.
Den String scannen, nach u\ suchen und die nächsten vier Zeichen mit StrToInt umwandeln.
Dann mit UTF8Encode(WideChar(myWord)) umwandeln und in die String Kopie einfügen.
Danach kannst du mit UTF8ToSys u.U auf Windows einen Ansi String erhalten (Unter Laz. aber nicht zu empfehlen)

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

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von theo »

@mschnell: Mal wieder ein Unicode-Schwachsinn-Kommentar von mschnell :lol:

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von m.fuchs »

theo hat geschrieben:Den String scannen, nach u\ suchen und die nächsten vier Zeichen mit StrToInt umwandeln.
Ähm Hex2Dec statt StrToInt oder? Sonst bräuchte ich ja noch ein $
theo hat geschrieben:Dann mit UTF8Encode(WideChar(myWord)) umwandeln und in die String Kopie einfügen.
Danach kannst du mit UTF8ToSys u.U auf Windows einen Ansi String erhalten (Unter Laz. aber nicht zu empfehlen)
Warum nicht zu empfehlen?

mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von theo »

Hab ich eben runtergehackt. Ist noch nicht gut getestet:

Code: Alles auswählen

Function UnicodeEscapeToUTF8(S:String): String;
Var len, i, count: integer;
  temp: String;
Begin
  len := length(S);
  SetLength(Result,len);
  i := 1;
  count := 1;
  Repeat
    If S[i]='\' Then
      If (i<len) And (S[i+1]='u') Then
        Begin
          If i<len-4 Then
            Begin
              temp := Copy(S,i+2,4);
              temp := UTF8Encode(WideChar(StrToInt('$'+temp)));
              Insert(temp,Result,Count);
              inc(Count,length(Temp));
              inc(i,6);
            End;
        End;
    Result[count] := S[i];
    inc(count);
    inc(i);
  Until i>len;
  SetLength(Result,count-1);
End;

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

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von theo »

mikescu hat geschrieben: Warum nicht zu empfehlen?
Weil die LCL mit UTF8 arbeitet (Linux heute auch). Du kannst das Resultat obiger Funktion versuchen mit UTF8ToSys in Ansi umzuwandeln, wenn du unbedingt willst und unter Ansi Windows bist.
P.S. die Forum Software hackt oben den Backslash weg. Mit Zitieren siehst du aber den originalen Code.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von pluto »

@theo
Dein Beispiel wird bei mir zu 95% Rot angezeigt im Browser *G*.... Das ist schon mal eine Warnung. Rot = Warnfarbe :D

@mikescu
Mir ist aufgefallen, in meinen Projekten: Wenn ich WideStrings nutze bekomme ich die Tollsten Fehler. Z.B. in Verbindung mit TextOut. Ich denke mal du kannst folgendes versuchen:
StringVar:='meine Unicode Escape Sequences';
Wobei StringVar vom Typ String sein sollte. Kann natürlich auch sein das TextOut in der API das Automatisch umwandelt.
MFG
Michael Springwald

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von mschnell »

@Theo: Ich habe doch inhaltlich exakt dasselbe gesagt wie Du (z.B.: "(Unter Laz. aber nicht zu empfehlen)"). Nur dass Du natürlich - weil Du tatsächlich mit dem aktuellen Unicode-Lazarus arbeitest, die Namen der notwendigen RTL-Funktionen weißt und damit dem OP möglicherweise auch weiterhelfen kannst.

-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von mschnell »

mikescu hat geschrieben:Warum nicht zu empfehlen?
Siehe jede Menge Diskussionen über Unicode im Laufe des Jahres in diesem Forum (ie zu keiner einhelligen Meinung <z.B. zwischen Theo und mir> geführt haben :shock: ).
-Michael

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von mschnell »

pluto hat geschrieben:Mir ist aufgefallen, in meinen Projekten: Wenn ich WideStrings nutze bekomme ich die Tollsten Fehler.
Warum das so ist, ist weitgehend (mühsam) geklärt worden. Ob das gut so ist, darüber streiten sich die Geister. Siehe besagte Diskussionen....
-Michael

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

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von theo »

pluto hat geschrieben:@theo
Dein Beispiel wird bei mir zu 95% Rot angezeigt im Browser *G*.... Das ist schon mal eine Warnung. Rot = Warnfarbe :D
Hab ich ja geschrieben. Das ist die Forum Software. Dort wo der rote Teil beginnt, wäre ein \ Zeichen. Das wird aber vom Forum Hightlighter irgendwie verschluckt. Den originalen Code siehst du, wenn du auf "Zitieren" clickst.

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

Re: Unicode Escape Sequences in AnsiString konvertieren

Beitrag von theo »

mschnell hat geschrieben:@Theo: Ich habe doch inhaltlich exakt dasselbe gesagt wie Du (z.B.: "(Unter Laz. aber nicht zu empfehlen)"). Nur dass Du natürlich - weil Du tatsächlich mit dem aktuellen Unicode-Lazarus arbeitest, die Namen der notwendigen RTL-Funktionen weißt und damit dem OP möglicherweise auch weiterhelfen kannst.
Nur weil du's nicht kapierst, muss du nicht gleich wortreich aber inhaltsarm den Neulingen Angst machen.
Die Lösung habe ich gezeigt. Es ist nicht so schwierig.
Ausserdem hat diese Aufgabe mit den üblichen Unicode Diskussionen wenig zu tun.

Antworten