![]() |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
nahpets:
Genau in die Richtung soll es gehen, also aus einer Datei den String auslesen und in ein echtes Steuerzeichen umwandeln. Aber wie der Günther schon schrieb habe ich das Problem, dass der Char max. 65535 aufnimmt und die Emoticons weit drüber liegen. |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
Niemand zwingt uns ja mit Char zu arbeiten, vor allem da StringReplace(..) eh nur mit Strings arbeitet.
Ich persönlich habe es jetzt eine Weile versucht, aber ich scheitere ehrlich gesagt daran den String '128064' in einen String mit dem Alien-Emoji umzurechnen. Ich dachte mache mir einen Integer mit dem Wert 128064, rechne das ein Byte-Array mit 4 Elementen und gebe das letztendlich an TEncoding.Unicode.GetBytes(meinArray) welches einen String liefert. Leider klappt das auch nicht, das Byte-Array ist ein völlig anderes als TEncoding.Unicode.GetBytes(stringMitAlienEmoji) liefert. Wir brauchen einen Profi! |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
Ja, das habe ich übersehen, dass wir es hier mit 4 Byte Unicode zu tun haben. Deshalb muss hier UCS4 zu UTF16 gewandelt werden. Damit das funktioniert wird Delphi ab 2009 benötigt.
Delphi-Quellcode:
Vielleicht bekommt ja irgend jemand heraus, wie man UCS4StringToUnicodeString benutzen muss, um zum richtigen Ergebnis zu kommen?
function StringToSteuerZeichen(const s: String): String;
var C: Cardinal; sl, sh: Word; begin C := StrToInt(copy(s, 2, MaxInt)); if c>=$10000 then begin dec(c, $10000); sl := c and $3FF; sl := sl or $DC00; //$DC00 = $37 shl 10 sh := c shr 10; sh := sh or $D800; //$D800 = $36 shl 10 SetLength(Result, 2); Result[1] := Char(sh); Result[2] := Char(sl); end else begin SetLength(Result, 1); Result[1] := Char(c); end; |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
samso:
Perfekt, es funktioniert :cheer: Vielen Dank an Alle für Eure Zeit. |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
Heißt das, dass dashier funktioniert
Delphi-Quellcode:
wenn der Inhalt der Datei so
var
sl : TStringList; i : Integer; begin sl := TStringList.Create; sl.LoadFromFile('Steuerzeichen.cfg'); for i := 0 to sl.Count - 1 do begin sText := StringReplace(sText, StringToSteuerZeichen(sl[i]), '', [rfReplaceAll, rfIgnoreCase]); end; sl.Free; end;
Code:
aussieht?
#128064
#128125 #128148 |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
Nein.
|
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
Zitat:
|
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
Wenn man lieber UCS4StringToUnicodeString benutzen möchte, dann geht das so:
Delphi-Quellcode:
function StringToSteuerZeichen(const s: String): String;
var c: Cardinal; t: UCS4String; begin c := StrToInt(copy(s, 2, MaxInt)); SetLength(t, 2); t[0] := UCS4Char(c); t[1] := UCS4Char(0); Result := UCS4StringToUnicodeString(t); end; |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
In Delphi ist der UCS4 Deklariert als Cardinal
UCS4Char = type Cardinal; und UCS4String = array of UCS4Char; Leider ist in der Function UCS4StringToUnicodeString ein Fehler..... es wird immer ein UCS4 char zu wenig ausgewertet........ Also selber machen.
Delphi-Quellcode:
function myUCS4StringToUnicodeString(const S: UCS4String): UnicodeString;
var I: Integer; CharCount: Integer; Tmp: array of Char; begin SetLength(Tmp, Length(S) * 2); //Maximum possible number of characters CharCount := -1; I := 0; while I < Length(S) do // Removed -1 begin if S[I] >= $10000 then begin Inc(CharCount); Tmp[CharCount] := WideChar((((S[I] - $00010000) shr 10) and $000003FF) or $D800); Inc(CharCount); Tmp[CharCount] := WideChar(((S[I] - $00010000) and $000003FF)or $DC00); end else begin Inc(CharCount); Tmp[CharCount] := WideChar(S[I]); end; Inc(I); end; SetString(Result, PChar(Tmp), CharCount + 1); end; procedure TForm32.Button1Click(Sender: TObject); const u41: UCS4Char = 128064; u42: UCS4Char = 128125; u43: UCS4Char = 128148; Var test: Ucs4String; temp: String; begin test := [u41, u42, u43]; temp := myUCS4StringToUnicodeString(test); ShowMessage(temp); end; |
AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen
Ah Sorry, dachte es ginge immer um "in ein echtes Steuerzeichen umwandeln".
Das "StringReplace(sText, ..., '', [rfReplaceAll, rfIgnoreCase]);" löscht aber 8-) Also so könnte es funktionieren. Vermutlich ist es aber umständlich und langsam. Ggf, macht es Sinn die Liste im Speicher zu halten. Ggf, macht es auch Sinn auf die Liste zu verzichten und gleich ganze Unicode-Blöcke zu löschen. Oder alle Surrogaten, oder alle combined Chars ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz