2016-09-21 1 views
0

Je souhaite afficher les symboles cyrilliques avec XDrawString(), mais à l'écran, ils sont affichés avec un codage incorrect.Codage incorrect XDrawString

J'ai installé xfonts-cyrillic dans mon système (ubuntu 14.04), mais toute police de xlsfonts affiche un mauvais résultat.

Mon code (main.cpp):

#include <X11/Xlib.h> 
#include <string.h> 

int main(int, char**) 
{ 
    Display *d = XOpenDisplay(0); 
    Window r = DefaultRootWindow(d); 
    Window w = XCreateSimpleWindow(d, r, 0, 0, 256, 256, 0, 0, 0xffffff); 
    GC gc = DefaultGC(d, 0); 

    XMapRaised(d, w); 
    XSelectInput(d, w, ExposureMask); 

    Font font = XLoadFont(d, "9x15-cyrillic"); 
    XSetFont(d, gc, font); 

    const char *msg = "тут текст"; // cyrillic symbols 

    while (1) 
    { 
     XEvent e; 
     XNextEvent(d, &e); 
     XDrawString(d, w, gc, 16, 16, msg, (int) strlen(msg)); 
    } 
} 

Compile:

g++ -Wall -g -std=c++11 main.cpp -L/usr/lib/X11 -lX11 -o output 

Mon résultat est:

enter image description here

Pourquoi dans le texte de la fenêtre de résultat est dans un mauvais encodage ? Qu'est-ce qui me manque?

Répondre

4

X11 est antérieur à Uicode de plusieurs millénaires (en années Internet). Votre programme utilise probablement UTF-8, et X11 par défaut ne fonctionne pas. Essayez Xutf8DrawString. Sinon, déterminez les encodages que vos polices utilisent (les xlsfonts vous le diront, car l'encodage fait partie de XLFD, mais il ressemble à KOI8-R) et utilisez cet encodage pour votre chaîne.

Il est à noter que les programmes réels utilisent rarement les polices côté serveur de nos jours. Voir this pour plus d'informations.