[Erledigt]String-Konvertierung (Emoji Font)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

[Erledigt]String-Konvertierung (Emoji Font)

Beitragvon hubblec4 » 9. Mär 2019, 02:01 [Erledigt]String-Konvertierung (Emoji Font)

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von hubblec4 am 17. Mär 2019, 14:17, insgesamt 2-mal geändert.
hubblec4
 
Beiträge: 216
Registriert: 25. Jan 2014, 17:50

Beitragvon theo » 9. Mär 2019, 11:40 Re: String-Konvertierung

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
theo
 
Beiträge: 8146
Registriert: 11. Sep 2006, 18:01

Beitragvon hubblec4 » 9. Mär 2019, 13:27 Re: String-Konvertierung

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?
hubblec4
 
Beiträge: 216
Registriert: 25. Jan 2014, 17:50

Beitragvon theo » 9. Mär 2019, 13:38 Re: String-Konvertierung

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.
theo
 
Beiträge: 8146
Registriert: 11. Sep 2006, 18:01

Beitragvon hubblec4 » 9. Mär 2019, 17:48 Re: String-Konvertierung

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.
hubblec4
 
Beiträge: 216
Registriert: 25. Jan 2014, 17:50

Beitragvon Michl » 9. Mär 2019, 20:41 Re: String-Konvertierung

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;
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2320
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon wp_xyz » 10. Mär 2019, 11:09 Re: String-Konvertierung

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon hubblec4 » 13. Mär 2019, 12:44 Re: String-Konvertierung

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: 216
Registriert: 25. Jan 2014, 17:50

Beitragvon hubblec4 » 13. Mär 2019, 13:11 Re: String-Konvertierung

@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.
hubblec4
 
Beiträge: 216
Registriert: 25. Jan 2014, 17:50

Beitragvon wp_xyz » 13. Mär 2019, 23:57 Re: String-Konvertierung

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.
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon hubblec4 » 14. Mär 2019, 14:15 Re: String-Konvertierung

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 15. Mär 2019, 02:25, insgesamt 1-mal geändert.
hubblec4
 
Beiträge: 216
Registriert: 25. Jan 2014, 17:50

Beitragvon wp_xyz » 14. Mär 2019, 16:43 Re: String-Konvertierung

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.
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon hubblec4 » 14. Mär 2019, 19:03 Re: String-Konvertierung

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).
hubblec4
 
Beiträge: 216
Registriert: 25. Jan 2014, 17:50

Beitragvon sstvmaster » 14. Mär 2019, 19:18 Re: String-Konvertierung

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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
OS: Windows 7 32/64bit
Lazarus 2.0.0, 32bit
Lazarus 2.1.0 Trunk 3.3.1, 32bit
sstvmaster
 
Beiträge: 147
Registriert: 22. Okt 2016, 22:12
OS, Lazarus, FPC: Lazarus 2.0 + 2.1.0 Trunk 3.3.1 / Win32, Windows 7 32+64bit | 
CPU-Target: 32Bit
Nach oben

Beitragvon hubblec4 » 15. Mär 2019, 02:18 Re: String-Konvertierung

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.
hubblec4
 
Beiträge: 216
Registriert: 25. Jan 2014, 17:50

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 2 Gäste

porpoises-institution
accuracy-worried