Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Widestring (https://www.delphipraxis.net/191056-widestring.html)

Peter666 4. Dez 2016 09:16

Widestring
 
Hallo,

ich habe mal ne Frage. Ich möchte gerne von einem Widestring die einzelnen Character auslesen. Nun gibt es Unicodezeichen die bestehen aus 2 Words.
#$D83D + #$DD12 zum Beispiel.

Hat jemand ne Idee wie ich herausbekomme, dass die beiden Zeichen zu einem gehören? Sonst bekomme ich 2x Unsinn, wenn ich die Zeichen einzeln via String[1]..[n] auslese.

Peter

Ydobon 4. Dez 2016 10:06

AW: Widestring
 
Vor 10 Jahren hätte ich noch gewusst wo ich bei mir den Code finde, jetzt habe ich ohne ewiges Suchen nur noch eine Idee. Die Bereiche für die einzelnen Bytes sind festgelegt, daran kann man sie erkennen.
https://de.wikipedia.org/wiki/UTF-16

Ghostwalker 4. Dez 2016 10:46

AW: Widestring
 
Bei Widestrings hat jeder Char eine fixe Größe (bei BSD 2006 sinds 2 Byte; Bei neueren 4 Byte).

Einfachste (und unabhängig von der Delphi/Cpu-Version):

Delphi-Quellcode:
function FindCharInWidestring(str:widestring;toFind:widechar):integer;
var
  p : PWidechar;
  max: integer;

begin
  result := -1;
  p := PWidechar(str);
  max := length(str);
  while (max >= 0) do
  begin
    if (p^ = toFind) then
      max := -1;
    else
    begin
      inc(p);
      inc(result);
      dec(max);
    end;
  end;
end;
Ungetestet und einfach aus dem Gedächtnis geschrieben :)

uligerhardt 4. Dez 2016 10:47

AW: Widestring
 
Vielleicht mit CharNext?

Ghostwalker 4. Dez 2016 10:49

AW: Widestring
 
oder natürlich einfach Delphi-Referenz durchsuchenPos

himitsu 4. Dez 2016 14:00

AW: Widestring
 
UTF-16 hat einen Vorteil, denn man kann mit Bitmasken prüfen ob ein Zeichen ein Einzelchar oder ein Surrogate und sogar ob es das erste oder zweite Char eines Surrogate ist.

Auch die user-definierten Chars lassen sich erkennen (auch wenn da keiner 'ne Ahnung hat, wie dieses Char interpretiert wird, abgesehn vom entsprechenden Programm, welches Diesen nutzt)
Aber auch Sicht des Unicode sind jene Chars immer Einzelzeichen.

CharNext macht da auch kein Hexenwerk.
Delphi-Quellcode:
function CharNext(Input: PWideChar): PWideChar;
begin
  Result := Input;
  Inc(Result, 1);
  if IsLastCharOfSurrogate(Reult) then
    Inc(Result, 1);

  // oder

  Result := Input;
  if IsFirstCharOfSurrogate(Reult) then
    Inc(Result, 2)
  else
    Inc(Result, 1);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz