Ich verwende Freetype 2.5.3
auf einer portablen OpenGL-Anwendung.Freetype Unicode unter Windows
Mein Problem ist, dass ich nicht Unicode auf meinem Windows-Rechner bekommen, während ich sie richtig auf Linux-basierte Systeme bekommen (Lubuntu, OSX, Android)
Ich bin der berühmte arialuni.ttf
mit (23mb), also bin ich mir ziemlich sicher, dass es alles enthält. In der Tat hatte ich diese in meiner früheren Windows-Installation (Win7), dann Win7 von einer anderen Quelle neu installiert und jetzt Unicode funktioniert nicht richtig.
Speziell wenn ich eine Zeichenkette zeichne, dann wird nur Latein wiedergegeben, während Unicode übersprungen wird. Ich grub tiefer und ich fand, dass Zeichencodes nicht sind, was sie in wstring
sein sollten. Zum Beispiel verwende ich einige griechische Buchstaben in der Zeichenfolge wie γ
, die ich weiß, dass es eine code point von 947
haben sollte.
Meine Engine iteriert nur die Zeichen wstring
und fährt den obigen Codepunkt auf einen anderen Vektor, der Texturkoordinaten enthält, damit ich die Glyphe zeichnen kann.
Das Problem ist, dass auf meinem Windows 7 Maschinen, die wstring
mir nicht geben 947
für ein γ
, sondern es gibt mir ein 179
. Darüber hinaus gibt das Zeichen Ά
als 2 Zeichen 206
Code (??) anstelle von 902
zurück.
Es ist wie einfache Iterieren ein wstring
, wie:
for(size_t c=0,sz=wtext.size();c<sz;c++) {
uint32_t ch = wtext[c]; // code point
...
}
Dies geschieht nur auf meinem neu Win7
installiert; Es funktionierte zuvor auf einem anderen Win7-System, zusammen mit meinen allen Linux-Maschinen. Nun ist es daran und auch auf meiner virtuellen XP-Maschine kaputt.
Ich benutze keine breiten Formatierungsfunktionen auf diese, genau wie:
wstring wtext = L"blΆh";
Darüber hinaus habe ich meine Glyphen richtig in meiner OpenGL Textur gerendert, wobei sehen kann entweder so keine Schrift Problem. Mein Fontgenerator verwendet den griechischen Bereich von ~ 900-950
Codepunkten, um die Glyphen zu sammeln.
ich fügen Sie den Code Punkte pro Sprache mit diesem:
FT_UInt charcode;
FT_ULong character = FT_Get_First_Char(face, &charcode);
do {
character = FT_Get_Next_Char(face, character, &charcode);
...
} while(charcode);
Das wird es für Windows reparieren und möglicherweise für andere brechen. Das Problem ist, dass UTF-8 keine BOM benötigt und auch nicht verwenden sollte (es bricht die ASCII-Kompatibilität). Aber da Windows um UTF-16 herum aufgebaut ist, das eine BOM verwendet, unterstützen viele Windows-Programme UTF-8 nicht wirklich, aber ein seltsames Nicht-Standard-UTF-8-mit-BOM – nim
Nur für den Fall kompilierte ich das Programm in Windows , Linux, OSX, iOS und Android und es gab kein Problem. – user6096479