Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi gibt es Utf16 Äquivalente zu Ord und Chr (https://www.delphipraxis.net/183563-gibt-es-utf16-aequivalente-zu-ord-und-chr.html)

Bjoerk 20. Jan 2015 13:36

gibt es Utf16 Äquivalente zu Ord und Chr
 
Hab nur Delphi2007, deshalb die Frage, gibt es Utf16 Äquivalente zu Ord und Chr? Da gibt es doch diese neue TCharacter class?

himitsu 20. Jan 2015 13:55

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
Ord passt sich an den Quell-Datentyp an (egal welcher ordinaler Typ das ist ... AnsiChar, WideChar, Enum usw.)
und Chr hängt vom Compiler ab. (genauso wie bei Char)


Genauso, wie im ANSI, arbeiten diese Funktionen immer nur auf einzelnen Chars/Speichereinheiten und nicht auf komplexeren "MultiBytes".
Im AnsiString also nur auf einem Byte (AnsiChar) und im Unicode nur auf einem Word (WideChar).

Mit sowas wie UTF-8 oder den Surrogates kommen diese Befehle nicht klar und interpretieren natürlich nur die einzelne Chars und nicht komplette "Zeichen".


Somit ist seit Delphi 2009 das Chr oder Char ein WideChar und vorher war es ein AnsiChar.
Und beim Ord hat sich mit Delphi 2009 garnichts geändert.

Bjoerk 20. Jan 2015 14:38

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
Es muß doch eine IndexOfChar geben, um den aktuellen Windows Zeichensatz auszulesen, die (wesentlich) schneller als das ist?

Delphi-Quellcode:

  TWideChar = packed record
    case Byte of
      0: (Value: WideChar);
      1: (Code: Word);
  end;

function GetWideChr(const Code: word): WideChar;
var
  WChar: TWideChar;
begin
  WChar.Code := Code;
  Result := WChar.Value;
end;

function GetWideOrd(const Value: WideChar): integer;
var
  I: integer;
  WChar: TWideChar;
begin
  Result := -1;
  for I := 0 to 65535 do
  begin
    WChar.Code := I;
    if WChar.Value = Value then
    begin
      Result := I;
      Break;
    end;
  end;
end;

procedure TDoubleDiceEncryptionForm.Button1Click(Sender: TObject);
var
  WChar: TWideChar;
begin
  WChar.Code := 7888;
  MessageBoxW(Handle, PWideChar
    (WideFormat('%s = Code %d', [GetWideChr(WChar.Code), GetWideOrd(WChar.Value)])),
      'Test', MB_ICONINFORMATION);
end;

p80286 20. Jan 2015 15:36

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
Zitat:

Zitat von Bjoerk (Beitrag 1287155)
Es muß doch eine IndexOfChar geben, um den aktuellen Windows Zeichensatz auszulesen, die (wesentlich) schneller als das ist?

Wenn du 16Bit Zeichen hast, dann gibt es den klassischen Zeichensatz nicht mehr. (So war zumindest mal die Theorie) Jedes Zeichen hat seinen festen Platz. Einen Zeichensatz (CodeTable) benötigst Du nur, wenn gleiche Werte unterschiedlich interpretiert werden sollen.
U.U. ist der Font den du nutzt nicht Unicode tauglich?

Gruß
K-H

Bernhard Geyer 20. Jan 2015 15:44

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
Das müsste doch so einfach gehen:

Delphi-Quellcode:
procedure TDoubleDiceEncryptionForm.Button1Click(Sender: TObject);
var
  WChar: WideChar;
begin
  WChar = #7888;
  MessageBoxW(Handle, PWideChar
    (WideFormat('%s = Code %d', [WChar, Ord(WChar)])), 'Test', MB_ICONINFORMATION);
end;

Bjoerk 20. Jan 2015 16:21

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
Keine Ahnung? Sieht aber korrekt aus. Thanx!

himitsu 20. Jan 2015 17:24

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
Zitat:

Delphi-Quellcode:
function GetWideChr(const Code: word): WideChar;
var
  WChar: TWideChar;
begin
  WChar.Code := Code;
  Result := WChar.Value;
end;

function GetWideOrd(const Value: WideChar): integer;
var
  I: integer;
  WChar: TWideChar;
begin
  Result := -1;
  for I := 0 to 65535 do
  begin
    WChar.Code := I;
    if WChar.Value = Value then
    begin
      Result := I;
      Break;
    end;
  end;
end;

gekürzt:
Delphi-Quellcode:
function GetWideOrd(const Value: WideChar): Integer;
var
  WChar: TWideChar;
begin
  WChar.Value := Value;
  Result := WChar.Code;
end;
noch mehr gekürzt:
Delphi-Quellcode:
function GetWideChr(const Code: word): WideChar;
var
  WChar: TWideChar absolute Code;
begin
  Result := WChar.Value;
end;

function GetWideOrd(const Value: WideChar): Integer;
var
  WChar: TWideChar absolute Value;
begin
  Result := WChar.Code;
end;
noch bissl mehr:
Delphi-Quellcode:
function GetWideChr(const Code: word): WideChar;
begin
  Result := TWideChar(Code).Value;
end;

function GetWideOrd(const Value: WideChar): Integer;
begin
  Result := TWideChar(Value).Code;
end;
und jetzt total:
Delphi-Quellcode:
function GetWideChr(const Code: word): WideChar;
begin
  Result := WideChar(Code); // oder Chr(Code) oder Char(Code) ... Beides natürlich erst ab D2009
end;

function GetWideOrd(const Value: WideChar): Integer;
begin
  Result := Ord(Value);
end;

Bjoerk 20. Jan 2015 18:11

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
OK. Ich war halt auch noch etwas verunsichert, weil Marco Cantu schreibt, man solle sich nicht wundern wenn Chr(128) und #128 in > D2007 unterschiedliche Werte liefert (liefern kann). Daß Chr in > D2007 WideChar entspricht hatte ich auch nicht bedacht. Das heißt, ich muß an meinem Code gar nichts ändern. Die Umstellung auf UniCode ist dann doch gar nicht soooo kompliziert? Vielleicht hol ich mir dann doch mal ein neues Delphi. Thanx!

himitsu 20. Jan 2015 21:09

AW: gibt es Utf16 Äquivalente zu Ord und Chr
 
Zitat:

man solle sich nicht wundern wenn Chr(128) und #128 in > D2007 unterschiedliche Werte liefert (liefern kann).
Das tut es auch.

Denn Nur die Zeichen von #0 bis #127 sind in allen Charsets gleich und stimmen 1:1 mit Unicode überein.

Im ANSI sind aber die Zeichen von 128# bis #255 unterschiedlichen Unicodezeichen zugeordnet, je nach Charset.
siehe z.B. die ä, ö und ü, welche es erstmal nicht in allen Ansi-Zeichensätzen gibt, oder die dort an anderer ordinaler Stelle liegen, als im Unicode.
Abgesehn von ISO 8859-1, wo äöü an der selben Stelle liegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 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