AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Name von Unicode-Zeichen

Ein Thema von Codehunter · begonnen am 27. Jun 2017 · letzter Beitrag vom 3. Jul 2017
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.190 Beiträge
 
Delphi 12 Athens
 
#1

AW: Name von Unicode-Zeichen

  Alt 27. Jun 2017, 16:18
Nicht das es dir jetzt weiterhilft. Aber
diese Seiten finde ich auch ganz interessant
http://http://www.fileformat.info/info/unicode/char/03a9/index.htm
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Name von Unicode-Zeichen

  Alt 27. Jun 2017, 17:32
Es gibt die Unit Characters, aber da kann man sich nur die Typen/Gruppen/Eigenschaften der Chars holen,
aber leider nirgendwo die Namen.

Ich hatte auch in der GDI+ noch keine Funktion gefunden, welche den Namen liefert oder ob es das Zeichen überhaupt im Font gibt.
Du könntest zwar die Font-Datei selber auslesen/parsen und nachgucken, welche Zeichen darin definiert sind, aber das hilft nur bedingt, da in Windows auch ein Ersatzfont definiert sein könnte, welchen Windows zum Zeichnen des fehlenden Chars verwendet.
PS: Die großen Unicodefonts von Windows (z.B. Arial und MingLiU) bestehen auch nicht nur aus einer Datei. (die Chars wurden da auf mehrere Dateien verteilt)

Außerdem gibt die GDI "absichtlich" keinerlei Fehlerinformationen aus, wenn man ein nicht-vorhandenes Zeichen oder gar mit einem nicht-vorhandenen Font etwas schreiben will.



Das Einzige, was mir damals auf die schnelle eingefallen war, ist ein Bildvergleich.
* erst ein nie vorhandenes Char auf ein Bitmap zeichnen (da kommt dann das Ersatzzeichen des Fonts raus, was meistens ein Rechteck ist)
* dann das gewünschte Char zeichnen
* und die Bilder dann vergleichen

Und die Fontnamen, da hatte ich auch von unicode.org (das ist ja die Vergabestelle für die Unicodedefinition) die CSV's besorgt und die benötigten Daten als Resource an meine Anwendung gehängt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (27. Jun 2017 um 17:36 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Name von Unicode-Zeichen

  Alt 27. Jun 2017, 17:57
Zugegeben ich habe es nicht getestet aber vieleicht hilft das:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Fritz Westermann
  Mit Zitat antworten Zitat
Ydobon

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

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 00:42
Ist schon über 10 Jahre her, als ich das Thema CJK und solche Probleme mal hatte. Um die alten Programme zu testen müsste ich allerdings erst mal die Tnt-Controls umbauen.
Aber laut Quelltexten z.B. GetGlyphIndices.
Falls noch weitere Fragen auftauchen lohnt sich vermutlich ein Blick in die Uniscribe-Abteilung. So weit ich mich erinnere kann die automatische Ersetzung aber bei solchen Test auch falsche Ergebnisse liefern.

PS: BabelMap ist da eine nette Sache.

Geändert von Ydobon (28. Jun 2017 um 00:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.286 Beiträge
 
Delphi 12 Athens
 
#5

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 07:52
Aber laut Quelltexten z.B. GetGlyphIndices.
Ich habe das jetzt mal so umgesetzt, wo GetGlyphIndices aber immer GDI_ERROR liefert. Mach ich da jetzt einen gedanklichen Fehler?
Delphi-Quellcode:
function TfrmMain.GetCharExists(const Chr: Char): Boolean;
var
  Buf: Word;
begin
  Result:= FALSE;
  if GetGlyphIndices(tvChars.Canvas.Handle, PChar(Chr), 1, @Buf,
                     GGI_MARK_NONEXISTING_GLYPHS) <> GDI_ERROR then
  begin
    Result:= (Buf <> $FFFF);
  end;
end;
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Ydobon

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

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 08:37
Mal schnell was rauskopiert. Funktioniert mit japanischen Text und Tahoma vs. Arial Unicode MS.

Delphi-Quellcode:
var pwOutGlyphs: PWord;
    i, cwstr: Integer;
    wstr: String;
    erg: Cardinal;
begin
  wstr:=Edit1.Text;
  cwstr:=Length(wstr);
  if wstr='then exit;
  GetMem(pwOutGlyphs, cwstr*2);
  ZeroMemory(pwOutGlyphs, cwstr*2);
  erg:=GetGlyphIndices(Canvas.Handle, @wstr[1], cwstr, pwOutGlyphs, GGI_MARK_NONEXISTING_GLYPHS);
  if erg=GDI_ERROR then RaiseLastOSError;
  ExtTextOut(Canvas.Handle, 10, 6, ETO_GLYPH_INDEX, Nil, PChar(pwOutGlyphs), cwstr, Nil);
  Memo1.Clear;
  for i:=0 to cwstr-1 do Memo1.Lines.Add(IntToHex(PWordArray(pwOutGlyphs)[i], 4));
end;
Edit: War noch von D2005.

Geändert von Ydobon (28. Jun 2017 um 08:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 08:44
Zitat:
PChar(Chr)


Delphi-Quellcode:
PChar(@Chr)
// bzw.
@Chr
Und dann noch die fehlende #0-Terminierung

Und C=1 ?
Was ist, wenn pgi größer sein muß?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Ydobon

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

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 08:58
Ähm, OK.

Dann halt noch die Uniscribe-Version. Der Rest stimmt überein.
Delphi-Quellcode:
var sc: TScriptCache;
    hr: HRESULT;

  sc:=Nil;
  hr:=ScriptGetCMap(Canvas.Handle, @sc, @wstr[1], cwstr, SGCM_RTL, pwOutGlyphs);
  if (hr<>S_OK) and (hr<>S_FALSE) then RaiseLastOSError;
  ScriptFreeCache(@sc);

Geändert von Ydobon (28. Jun 2017 um 11:13 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.075 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 09:09
Du kannst dich auch mal mit DirectWrite beschäftigen!
Da steckt sehr viel drin, was du sicherlich gebrauchen kannst.

Bspw. hat das IDWriteFont Interface eine HasCharacter-Methode.
Daneben gibt es noch eine Vielzahl weiterer Sachen, die sicherlich weiterhelfen:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, System.SysUtils, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Direct2D, Winapi.D2D1;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    function GetCharExists(const Chr: Char): Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := GetCharExists('').ToString(TUseBoolStrs.True);
end;

function TForm1.GetCharExists(const Chr: Char): Boolean;
var
  hr: HRESULT;
  FontHandle: HFont;
  LogFont: TLogFont;
  GdiInterop: IDWriteGdiInterop;
  WriteFont: IDWriteFont;
  CharacterExists: BOOL;
begin
  Result := False;
  hr := DWriteFactory.GetGdiInterop(GdiInterop);
  if SUCCEEDED(hr) and Assigned(GdiInterop) then
  begin
    FontHandle := Self.Font.Handle;
    if GetObject(FontHandle, SizeOf(LogFont), @LogFont) <> 0 then
    begin
      hr := GdiInterop.CreateFontFromLOGFONT(LogFont, WriteFont);
      if SUCCEEDED(hr) and Assigned(WriteFont) then
      begin
        hr := WriteFont.HasCharacter(Ord(Chr), CharacterExists);
        Result := SUCCEEDED(hr) and CharacterExists;
      end;
    end;
  end;
end;

end.

Geändert von TiGü (28. Jun 2017 um 09:18 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.075 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Name von Unicode-Zeichen

  Alt 28. Jun 2017, 09:23
Vielleicht als Einstieg, wenn man von der alten GDI/WinApi-Welt kommt: https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:12 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