2016-03-22 10 views
0

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); 

Antwort

0

nicht sicher, warum, aber ich es behoben, indem die Datei als UTF-8 BOM speichern, eher UTF-8 (ich hatte es in der Standardeinstellung).

+0

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

+0

Nur für den Fall kompilierte ich das Programm in Windows , Linux, OSX, iOS und Android und es gab kein Problem. – user6096479