AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Widestring

Ein Thema von Peter666 · begonnen am 4. Dez 2016 · letzter Beitrag vom 4. Dez 2016
Antwort Antwort
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

Widestring

  Alt 4. Dez 2016, 10:16
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
  Mit Zitat antworten Zitat
Ydobon

Registriert seit: 3. Mär 2006
264 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Widestring

  Alt 4. Dez 2016, 11:06
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
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Widestring

  Alt 4. Dez 2016, 11:46
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
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Widestring

  Alt 4. Dez 2016, 11:47
Vielleicht mit CharNext?
Uli Gerhardt
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Widestring

  Alt 4. Dez 2016, 11:49
oder natürlich einfach Delphi-Referenz durchsuchenPos
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Widestring

  Alt 4. Dez 2016, 15:00
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 4. Dez 2016 um 15:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:33 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