[Erledigt]String-Konvertierung (Emoji Font)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

[Erledigt]String-Konvertierung (Emoji Font)

Beitrag von hubblec4 »

Hallo Lazarusgemeinde

Ich habe da ein Problem mit der String konvertierung es geht dabei um dies:
"Unicode code points > U+ffff handled incorrectly"

Ich habe für ein bekanntes Programm, MKVToolNix einen Fehler gefunden und diesen auf GitHub gepostet, der Betreiber hat das dann gefixt.
Problem: https://gitlab.com/mbunkus/mkvtoolnix/issues/2516
Fix: https://gitlab.com/mbunkus/mkvtoolnix/commit/d8803346e8c74ff0c5a7f4fa018b7b3bb4c5cbd5
Es geht dabei um Emoji's welche nun in der gefixten Version richtig dargestellt werden. Wenn ich eine solche Datei, die im Dateinamen Emoji-Zeichen enthält in mein Programm lade, dann werden nur komisches Zeichen angezeigt.
Die Emoji Zeichen sind weiterhin in einer xml oder mkv Datei in einem bestimmten Element gespeichert. Als UTF8 soweit ich das sehe.
Wenn mein Programm das einliest(Dateiname und Daten) dann werden die in Editfeldern oder Lables nicht korrekt angezeigt.
Aber wenn ich dann in eine xml speichere dann stehen da auch unlesereliche Zeichen drin welche aber korrekt sind den MKVToolNix liest es wieder ordentlich aus und zeigt es als Emoji's an.

Ich weis das der Code dort mit C zu tun hat, aber dennoch wird dort von ut8 nach utf16 bzw utf32 und zurück umgewandelt.
Die Daten liegen in utf8 vor, so verlangen es die Matroska specs.

Welche String-Umcodierung sorgt denn dafür das die Emoji's angezeigt werden?
Zum beispiel beim onDrop auf die Form soll der Dateiname als Titel angezeigt werden(bei mir ist es ein Caption vom TabSheet).

Als Hinweis für die Moderatoren des Forum:
Als ich versucht habe eine Datei hier für den Post anzuhängen kam eine SQL-Fehler meldung.
Die Datei enthielt Emoji Zeichen. Habe dann die Datei umbenannt und alles klappte wieder.
Dateianhänge
Tags-xml.7z
(678 Bytes) 85-mal heruntergeladen
mkv-mitEmojis.7z
(368.37 KiB) 88-mal heruntergeladen
MTX.jpg
cE.jpg
Zuletzt geändert von hubblec4 am So 17. Mär 2019, 14:17, insgesamt 2-mal geändert.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: String-Konvertierung

Beitrag von theo »

Naja, solche Dateinamen führen mit Sicherheit an der einen oder anderen Stelle zu Ärger, aber bei mir funktioniert es so.
Oben eine TFileListBox und unten ein TMemo

Lazarus 2.0.0 rUnknown FPC 3.0.4 x86_64-linux-gtk2
OpenSUSE Leap 15

Vielleicht unterstützt dein Font/System/GTK2 das nicht?
Als Form.Caption funktioniert es bei mir aber auch nicht.
Dateianhänge
emoji.png

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: String-Konvertierung

Beitrag von hubblec4 »

Hi theo

Ich bin mit Win7 64bit unterwegs. Da ja in MKVToolNix alles korrekt angezeigt wird, gehe ich mal davon aus das auf meinem System alle nötigen Fonts vorhanden sind.

Könntest du etwas Quellcode zeigen, oder ist es bei dir so einfach? Also ich frage mich ob du da irgendwas umgewandelt /konvertiert hast.

Wie sieht es denn mit einem Edit-Feld aus. Werden da die Emoji's richtig angezeigt oder wie ist es bei einem TabSheet.caption?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: String-Konvertierung

Beitrag von theo »

hubblec4 hat geschrieben:
Könntest du etwas Quellcode zeigen, oder ist es bei dir so einfach? Also ich frage mich ob du da irgendwas umgewandelt /konvertiert hast.

Wie sieht es denn mit einem Edit-Feld aus. Werden da die Emoji's richtig angezeigt oder wie ist es bei einem TabSheet.caption?


Nö, ich mache nur:

Code: Alles auswählen

procedure TForm1.FileListBox1Change(Sender: TObject);
begin
 Memo1.Lines.LoadFromFile(FileListBox1.FileName);
end;

Edit und Tabsheet funktionieren auch.

Aber Linux <> Windows.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: String-Konvertierung

Beitrag von hubblec4 »

Habe das eben mal bei mir mit einer FileListBox getestet. Property Directory: Neuen Ordnerpfad eingegeben und dann werden die Dateien aufgelistet(schon zur Designzeit), aber dennoch sehe ich keien Emoji's.

Interessant finde ich das bei dir Alle Emoji's angezeigt werden. Auch bei dem Wert TagString im xml im Memo. Das ist bei MKVToolNix auch nicht der fall.

Ich vermute mal das du das auf Linux getestet hast, könnte ich dann auch nochmal machen, aber wenn es unter Windows nicht läuft wäre das schon blöd.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: String-Konvertierung

Beitrag von Michl »

Unter Windows 7 klappt die Darstellung auch problemlos. Man muss nur einen Font laden, der die Emojis darstellen kann. Siehe https://forum.lazarus.freepascal.org/index.php?topic=21032.15. Als Font hatte ich den Quivira 4.1 eben runtergeladen (von hier http://www.sonderzeichen.de/Emoticons/Unicode-1F60D.html) :

Code: Alles auswählen

const
  MM_MAX_NUMAXES =  16;
  FR_PRIVATE     = $10;
 
type
  PDesignVector = ^TDesignVector;
  TDesignVector = packed record
    dvReserved: DWORD;
    dvNumAxes : DWORD;
    dvValues  : array[0..MM_MAX_NUMAXES-1] of LongInt;
  end;
 
function AddFontResourceEx(Dir: PAnsiChar; Flag: Cardinal;
                           PDV: PDesignVector): Int64; stdcall;
                           external 'GDI32.dll' name 'AddFontResourceExA';
 
function RemoveFontResourceEx(Dir: PAnsiChar; Flag: Cardinal;
                              PDV: PDesignVector): Int64; stdcall;
                              external 'GDI32.dll' name 'RemoveFontResourceExA';
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  if AddFontResourceEx(PAnsiChar(GetCurrentDir + PathDelim + 'Quivira.otf'), FR_Private, Nil) <> 0 then
    Memo1.Font.Name := 'Quivira';
  Memo1.Lines.LoadFromFile('TestXmlVonOben.xml');
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Memo1.Font.Name = 'Quivira' then
    RemoveFontResourceEx(PAnsiChar(GetCurrentDir + PathDelim + 'Quivira.otf'), FR_Private, Nil);
end;
Dateianhänge
emoji.png
emoji.png (9.45 KiB) 3683 mal betrachtet

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: String-Konvertierung

Beitrag von wp_xyz »

Generell: Lazarus verwendet UTF8 standardmäßig. Wenn eine Datei UTF8-kodierte Zeichen enthält, braucht man keine Zeichenumwandlung, sogar: man DARF sie nicht anwenden, denn damit richtet man erst recht den Schaden an.

Das beigefügte Beispiel lädt die in deinem Beitrag beigefügte Datei ohne irgendwelche zusätzliche Aktionen in ein Memo, und es wird (auch mit dem Standard-Font von Windows 10) alles richtig angezeigt. Einziges Problem ist im Code-Editor, der offenbar mit den vielen Emojis im Dateinamen nicht klarkommt.
Dateianhänge
xml_emojis.zip
(2.7 KiB) 106-mal heruntergeladen

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: String-Konvertierung

Beitrag von hubblec4 »

Ich war zwei Tage weg, danke für die Tipps, Erklärungen und Beispiele.
Ich werde vielleicht heute abend dazu kommen alles mal zu testen.

Wegen dem Font nachladen:
Ich nutze Win7 64bit im Klassic Style und für MKVToolNix musste ich keinen Font nachladen, heist das das das Tool diesen Font "mitbringt"?
Denn sehen tu ich ja in meinem Tool keine Emoji's.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: String-Konvertierung

Beitrag von hubblec4 »

@wp_xyz

Habe eben dein Test-Tool getestet.
So in der art sah mein Test beispiel programm auch aus. Und wie sollte es anderes sein, es funktioniert NICHT auf meinem system.
Im Memo werden keine Emoji angezeigt und auch im Titel sind keine zu finden, nur diese Kästchen.


EDIT: Dann habe ich mir den Font herruntergeladen den Michl verlinkt hat. Habe den auch mal installiert.
Keine Änderung im Memo, dann habe ich in deinem Test-tool den Font fürs Memo1 geändert und siehe da es geht.

Allerdings im Form.Caption geht es nicht. Ebenso ist nicht gut das ich den Font für eine Komponente Wechseln muss um die Emoji anzuzeigen, weil was ist wenn noch mehr Text in dem Memo steht und der soll dann mit den Programm-Standard-Font angezeigt werden....

Ich vermute aber mal das auf Win10 und Linux das "normal"/out-of-the-box funktioniert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: String-Konvertierung

Beitrag von wp_xyz »

Für Form.Caption ist aber auch ein System-Font zuständig, nicht der, den du dem Memo zugewiesen hast. Mache mal ein neues Projekt mit diesem Event-Handler im OnCreate des MainForm mit einem Memo:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := Format('System-Font: %s, Menu-Font: %s, Icon-Font: %s, Hint-Font: %s', [
    Screen.SystemFont.Name, Screen.MenuFont.Name, Screen.IconFont.Name, Screen.HintFont.Name
  ]);
  Memo1.Lines.Add(GetFontData(Memo1.Font.Handle).Name);
end;

Bei mir kommt da in allen Fällen "Segoe UI" (sowohl unter Windows 10 als auch unter Windows 7). Wenn dieser Schriftname bei dir nicht gezeigt wird, hast du das wahrscheinlich durch irgendwelche Theme-Einstellungen verändert. Setze probehalber auf das Standard-Theme zurück (altes Theme vorher speichern). Frag mich ich aber jetzt nicht, wo man das alles unter Windows 7 verändert.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: String-Konvertierung

Beitrag von hubblec4 »

Also bei mir kam da überall Tahoma als Font. Ich habe das jetzt mal in den Win7 einstellungen alles auf "Segoe UI" geändert, aber auch das hat nicht so recht geholfen.

Nur wenn ich den Font von Michl verwende gehts. Dazu setze ich den Font im Code für die entsprechende Komponente.


EDIT:
Habe eben in meinen Tool was getestet: Ich kann ja dort zur Laufzeit den Font ändern.
Also wenn ich auf "Quivira" stelle ,werden die Emoji angezeigt..im VirtualTreeview im LabelEdit im Tabsheet.caption usw.
Tahoma und Segoe UI gehen nicht.
Zuletzt geändert von hubblec4 am Fr 15. Mär 2019, 02:25, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: String-Konvertierung

Beitrag von wp_xyz »

Wahrscheinlich ist der Font Segoe UI von Win7 noch nicht vollständig. Unter Win10 hat die Datei eine Größe von 930 kB, unter Win7 nur 507 kB.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: String-Konvertierung

Beitrag von hubblec4 »

Kann man die Datei einfach von Win10 nehmen und bei Win7 überschreiben?

Verwunderlich ist dann wieder rum nur, dass in MKVToolNix (mit Font Segoe UI) die Emoji angezeigt werden, aber eben auch nicht alle(6 oder 7 sind weiterhin als Kästchen zu sehen).

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: String-Konvertierung

Beitrag von sstvmaster »

Hi, ich das mal bei mir getestet. Ich habe mir von dem Laptop meiner Tochter (Win10 1809) alle Segoe Fonts auf mein Win7 installiert. Ich denke aber das der Font "seguiemj.ttf" reicht.

Dann muss man noch folgendes tun:

- rechte MT Desktop -> Anpassen
- Aero-Design wählen
- unten auf "Fensterfarbe"
- "Erweiterte Darstellungseinstellungen.." klicken
Und dann wie in den Bildern gezeigt Font auswählen
Dateianhänge
LazSegoeXML.JPG
LazSegoeTitelleiste.JPG
LazSegoeDateinamen.JPG
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: String-Konvertierung

Beitrag von hubblec4 »

Hi sstvmaster

wärest du so nett und würdest alle Font Dateien uploaden? Ich habe kein Win10.

EDIT: Hab die Datei im Netz gefunden.

Antworten