AGB  ·  Datenschutz  ·  Impressum  







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

gibt es Utf16 Äquivalente zu Ord und Chr

Ein Thema von Bjoerk · begonnen am 20. Jan 2015 · letzter Beitrag vom 20. Jan 2015
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 14:36
Hab nur Delphi2007, deshalb die Frage, gibt es Utf16 Äquivalente zu Ord und Chr? Da gibt es doch diese neue TCharacter class?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 14:55
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.
$2B or not $2B

Geändert von himitsu (20. Jan 2015 um 14:59 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 15:38
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;
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 16:36
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 16:44
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;
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 17:21
Keine Ahnung? Sieht aber korrekt aus. Thanx!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 18:24
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;
$2B or not $2B

Geändert von himitsu (20. Jan 2015 um 18:27 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 19:11
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: gibt es Utf16 Äquivalente zu Ord und Chr

  Alt 20. Jan 2015, 22:09
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.
$2B or not $2B
  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 07:21 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