Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Unicode-Beschreibung eines Zeichen auslesen (https://www.delphipraxis.net/74175-unicode-beschreibung-eines-zeichen-auslesen.html)

stz 29. Jul 2006 15:39


Unicode-Beschreibung eines Zeichen auslesen
 
Moin Moin,
es gibt ja zu jedem Unicode Zeichen auch eine Beschreibung, z.B.:
Zitat:

Zitat von Unicode
ä ($00E4) Kleiner lateinischer Buchstabe A mit Diärese

Windows scheint diese auch zu kennen, da die Zeichentabelle diese Beschreibung in der StatusBar anzeigen kann.

Wie komm ich nun an dieses Beschreibung heran? Gibt es dafür etwas in der API?

Gruß
Malte

Flocke 29. Jul 2006 16:10

Re: Unicode-Beschreibung eines Zeichen auslesen
 
1. Der dokumentiert Weg:

lege dir selbst eine Liste an und benutze z.B. das hier als Vorlage.

2. Der undokumentierte Weg:

das Programm charmap.exe benutzt getuname.dll (zumindest unter XP), die Funktion lässt sich so unter Delphi nutzen:

Delphi-Quellcode:
function GetUName(cCodwW: WideChar; pBufferW: PWideChar): integer;
  stdcall; external 'getuname.dll';

function GetUnicodeName(code: WideChar): WideString;
begin
  SetLength(Result, 256);
  SetLength(Result, GetUName(code, @Result[1]));
end;
(vorsicht: ungetestet)

stz 29. Jul 2006 16:28

Re: Unicode-Beschreibung eines Zeichen auslesen
 
Hi,
wie so oft ist der undokumentierte Weg doch der einfachere (und auf deutsch hab ichs dann auch noch). Allerdings habe ich nicht so ganz verstanden, wie du WideString und PWideChar vermischt. (Der Compiler hats glaub ich auch nicht verstanden, jedenfalls hat er nur die ersten 5 Buchstaben der Beschreibung geliefert), aber so gehts:
Delphi-Quellcode:
function GetUnicodeName(code: WideChar): String;
var
  buffer: PWideChar;
begin
  GetMem(buffer, 255);
  GetUName(code, buffer);
  Result := buffer;
  FreeMem(buffer, sizeof(buffer^));
end;
meinen herzlichen Dank für
Zitat:

Zitat von Flocke
Delphi-Quellcode:
function GetUName(cCodwW: WideChar; pBufferW: PWideChar): integer;
  stdcall; external 'getuname.dll';

:bouncing4: :bounce2: :bounce1:

Gruß
Malte

PS: Hat bei mir auch unter W2k SP4 funktioniert.

Flocke 29. Jul 2006 16:37

Re: Unicode-Beschreibung eines Zeichen auslesen
 
Zitat:

Zitat von stz
Allerdings habe ich nicht so ganz verstanden, wie du WideString und PWideChar vermischt. (Der Compiler hats glaub ich auch nicht verstanden, jedenfalls hat er nur die ersten 5 Buchstaben der Beschreibung geliefert), ...

Also ich gerade extra nochmal einfach den Code von oben kopiert, in Delphi eingefügt, ausprobiert und es funktioniert. Die Funktion "GetUName" liefert das Ergebnis von LoadStringW zurück (die Anzahl der WideChars im Ergebnis), darum sollte das SetLength eigentlich funktionieren.

Wenn du deinen Code beibehalten möchtest, dann mache aber aus der 255 eine 512 (oder 256 * SizeOf(WideChar)).

stz 29. Jul 2006 17:03

Re: Unicode-Beschreibung eines Zeichen auslesen
 
Zitat:

Zitat von Flocke
Also ich gerade extra nochmal einfach den Code von oben kopiert, in Delphi eingefügt, ausprobiert und es funktioniert. Die Funktion "GetUName" liefert das Ergebnis von LoadStringW zurück (die Anzahl der WideChars im Ergebnis), darum sollte das SetLength eigentlich funktionieren.

Ich fürchte unter W2k ist der Rückgabewert ein anderer. Ich bekomme als Eregbnis von GetUnicodeName('Ä') mit deiner Funktion nur "Große" und mit meiner "Großer lateinischer Buchstabe A mit Diärese". :gruebel:

Zitat:

Zitat von Flocke
Wenn du deinen Code beibehalten möchtest, dann mache aber aus der 255 eine 512 (oder 256 * SizeOf(WideChar)).

:oops: :oops: Richtig, ist ja WideChar...

stz 29. Jul 2006 17:12

Re: Unicode-Beschreibung eines Zeichen auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
so, also jetzt nochmal richtig:
Delphi-Quellcode:
function GetUName(cCodwW: WideChar; pBufferW: PWideChar): integer;
  stdcall; external 'getuname.dll';

function GetUnicodeName(code: WideChar): String;
var
  buffer: PWideChar;
begin
  GetMem(buffer, 256 * SizeOf(WideChar));
  try
    GetUName(code, buffer);
    Result := buffer;
  finally
    FreeMem(buffer, sizeof(buffer^));
  end;
end;
Anbei ein Bild von der Anwendung (ist bzw. wird ein Teil von MEdit).

Gruß
Malte

Flocke 29. Jul 2006 18:21

Re: Unicode-Beschreibung eines Zeichen auslesen
 
Zitat:

Zitat von stz
so, also jetzt nochmal richtig:
Delphi-Quellcode:
function GetUName(cCodwW: WideChar; pBufferW: PWideChar): integer;
  stdcall; external 'getuname.dll';

function GetUnicodeName(code: WideChar): String;
var
  buffer: PWideChar;
begin
  GetMem(buffer, 256 * SizeOf(WideChar));
  try
    GetUName(code, buffer);
    Result := buffer;
  finally
    FreeMem(buffer, sizeof(buffer^));
  end;
end;
Anbei ein Bild von der Anwendung (ist bzw. wird ein Teil von MEdit).

Gruß
Malte

Nicht ganz ...
Zitat:

Zitat von Borland-Hilfe
...
Der optionale Parameter Size enthält die Größe der freizugebenden dynamischen Variable (in Byte). Wenn er angegeben wird, muss er der Byte-Anzahl bei der Zuweisung mit GetMem entsprechen.

Lass den zweiten Parameter bei FreeMem einfach weg. Da wir nicht wissen, ob und wie wir den Rückgabewert von GetUName auswerten können, sollten man den Puffer vielleicht auch initialisieren.

Mein Vorschlag:
Delphi-Quellcode:
function GetUName(cCodwW: WideChar; pBufferW: PWideChar): integer;
  stdcall; external 'getuname.dll';

function GetUnicodeName(code: WideChar): string;
var
  Buffer: PWideChar;
begin
  GetMem(Buffer, 256 * SizeOf(WideChar));
  try
    Buffer^ := #0;
    GetUName(code, Buffer);
    Result := Buffer;
  finally
    FreeMem(Buffer);
  end;
end;

stz 29. Jul 2006 20:46

Re: Unicode-Beschreibung eines Zeichen auslesen
 
Zitat:

Zitat von Flocke
Mein Vorschlag

angenommen :???:

Gruß
Malte


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