AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

Ein Thema von bogdan · begonnen am 29. Jun 2017 · letzter Beitrag vom 30. Jun 2017
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 14:36
Oder meinst du dass du, aus welchen Gründen auch immer, Strings (z.B. '#1234') schon vorliegen hast und diese nun zu Chars (z.B. #1234) machen möchtest?
Genau da dürfte das Problem liegen:

Im Array steht '#1234', ersetzt werden soll aber #1234. Gesucht wird eine Methode, um aus '#1234' #1234 zu machen.

Einfacher wäre es, direkt ein Array mit Steuerzeichen zu machen, statt eine Array mit Zeichenfolgen, die so aussehen, wie Steuerzeichen im Delphiquelltext, wenn man deren mit # beginnenden Pedant nutzt.

Statt #1234 müsste doch auch Chr(1234) gehen, oder irre ich mich da?

In dem Fall könnte auch ein Array of Word (oder sowas) gehen und in der Ersätzroutine könnte es dann so aussehen:
Delphi-Quellcode:
const
  sZeichen : Array [1..3] of Word = (128064, 128125, 128148);

sText := StringReplace(sText, Chr(128064), '', [rfReplaceAll, rfIgnoreCase]);
(Bitte nicht hauen, wenn ich mich da jetzt irre )

Ok, wenn das Ganze nun nicht im Quelltext sein soll, dann hilft das Array so ja auch nicht.
Also z. B. eine Datei, die in jeder Zeile eine "Zahl" enthält, also
Code:
128064
128125
128148
Die Datei einlesen und dann zeilenweise abarbeiten.

Sinngemäß ungefähr sowas?
Delphi-Quellcode:
var
  sl : TStringList;
  i : Integer;
  ch : WideChar;
begin
  sl := TStringList.Create;
  sl.LoadFromFile('Steuerzeichen.cfg');
  for i := 0 to sl.Count - 1 do begin
    ch := WideChar(StrToInt(sl[i]));
    sText := StringReplace(sText, ch, '', [rfReplaceAll, rfIgnoreCase]);
  end;
  sl.Free;
end;
Edit: Geht das bei aktuellen Delphis mit WideChar?
Laut Delphi-7-Hilfe handelt es sich um: "WideChar-Werte stellen Zeichen mit einer Länge von mehr als einem Byte dar."

Geändert von nahpets (29. Jun 2017 um 15:01 Uhr) Grund: Nach der 95. Änderung hoffentlich nicht mehr nur noch Müll, wie am Anfang. Sollte halt erst denken dann schreiben :-(
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#2

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 14:43
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 15:10
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!
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#4

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 15:21
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:
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;
Vielleicht bekommt ja irgend jemand heraus, wie man UCS4StringToUnicodeString benutzen muss, um zum richtigen Ergebnis zu kommen?

Geändert von samso (29. Jun 2017 um 15:36 Uhr) Grund: Ergänzung
  Mit Zitat antworten Zitat
bogdan

Registriert seit: 15. Apr 2013
77 Beiträge
 
#5

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 16:28
samso:
Perfekt, es funktioniert

Vielen Dank an Alle für Eure Zeit.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 16:38
Heißt das, dass dashier funktioniert
Delphi-Quellcode:
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;
wenn der Inhalt der Datei so
Code:
#128064
#128125
#128148
aussieht?
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.513 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 16:45
Nein.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#8

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 16:57
Warum nicht? Genau so wie nahpets es schreibt, hätte ich gedacht funktioniert es.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 17:11
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;
Fritz Westermann

Geändert von Fritzew (29. Jun 2017 um 17:27 Uhr) Grund: Länge für Tmp korrigiert
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#10

AW: Steuerzeichen-String umwandeln in "echtes" Steuerzeichen

  Alt 29. Jun 2017, 17:22
@Fritzew: Zu UCS4StringToUnicodeString:
Ja, so wie Du es schreibst würde ich das auch logischer finden. Du musst bei Dir noch die maximal Anzahl der Character vergößern.

  SetLength(Tmp, Length(S) * 2); //Maximum possible number of characters
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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