Unicode Escape Sequences in AnsiString konvertieren
- 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
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
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
-
- 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
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
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
Re: Unicode Escape Sequences in AnsiString konvertieren
Mir nicht bekannt.mikescu hat geschrieben: Kennt da jemand eine Funktionen in Freepascal (RTL/FCL/LCL)?
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)
Re: Unicode Escape Sequences in AnsiString konvertieren
@mschnell: Mal wieder ein Unicode-Schwachsinn-Kommentar von mschnell 

- 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
Ähm Hex2Dec statt StrToInt oder? Sonst bräuchte ich ja noch ein $theo hat geschrieben:Den String scannen, nach u\ suchen und die nächsten vier Zeichen mit StrToInt umwandeln.
Warum nicht zu empfehlen?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)
mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Unicode Escape Sequences in AnsiString konvertieren
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;
Re: Unicode Escape Sequences in AnsiString konvertieren
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.mikescu hat geschrieben: Warum nicht zu empfehlen?
P.S. die Forum Software hackt oben den Backslash weg. Mit Zitieren siehst du aber den originalen Code.
-
- 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
@theo
Dein Beispiel wird bei mir zu 95% Rot angezeigt im Browser *G*.... Das ist schon mal eine Warnung. Rot = Warnfarbe
@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.
Dein Beispiel wird bei mir zu 95% Rot angezeigt im Browser *G*.... Das ist schon mal eine Warnung. Rot = Warnfarbe

@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
Michael Springwald
-
- 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
@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
-Michael
-
- 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
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 habenmikescu hat geschrieben:Warum nicht zu empfehlen?

-Michael
-
- 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
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....pluto hat geschrieben:Mir ist aufgefallen, in meinen Projekten: Wenn ich WideStrings nutze bekomme ich die Tollsten Fehler.
-Michael
Re: Unicode Escape Sequences in AnsiString konvertieren
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.pluto hat geschrieben:@theo
Dein Beispiel wird bei mir zu 95% Rot angezeigt im Browser *G*.... Das ist schon mal eine Warnung. Rot = Warnfarbe![]()
Re: Unicode Escape Sequences in AnsiString konvertieren
Nur weil du's nicht kapierst, muss du nicht gleich wortreich aber inhaltsarm den Neulingen Angst machen.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.
Die Lösung habe ich gezeigt. Es ist nicht so schwierig.
Ausserdem hat diese Aufgabe mit den üblichen Unicode Diskussionen wenig zu tun.