[Erledigt]String-Konvertierung (Emoji Font)
[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/c ... 3bb4c5cbd5
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.
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/c ... 3bb4c5cbd5
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) 109-mal heruntergeladen
-
mkv-mitEmojis.7z
- (368.37 KiB) 110-mal heruntergeladen
Zuletzt geändert von hubblec4 am So 17. Mär 2019, 14:17, insgesamt 2-mal geändert.
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.
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.
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?
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?
Re: String-Konvertierung
Nö, ich mache nur: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?
Code: Alles auswählen
procedure TForm1.FileListBox1Change(Sender: TObject);
begin
Memo1.Lines.LoadFromFile(FileListBox1.FileName);
end;
Aber Linux <> Windows.
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.
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.
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/in ... c=21032.15. Als Font hatte ich den Quivira 4.1 eben runtergeladen (von hier http://www.sonderzeichen.de/Emoticons/U ... 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 (9.45 KiB) 4017 mal betrachtet
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
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.
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) 124-mal heruntergeladen
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.
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.
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.
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.
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:
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.
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;
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.
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.
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.
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).
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).
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
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
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
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
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.
wärest du so nett und würdest alle Font Dateien uploaden? Ich habe kein Win10.
EDIT: Hab die Datei im Netz gefunden.