2016-03-31 5 views
1

J'essaye d'écrire un programme qui rendra des caractères asiatiques en UTF-8. Lorsque j'essaie de rendre le caractère dans un environnement de terminal ou d'éditeur de texte, il s'affiche correctement. Quand j'essaye de rendre au Caire, je récupère des rectangles dans ma sortie (pas le caractère UTF8 auquel je m'attendais). Ci-dessous est un exemple de code que je cours qui génère une sortie de fichier PNG avec le texte rendu. Lorsque je compile dans gcc et exécute le code, je n'obtiens pas le caractère attendu, but, mais obtiens plutôt un rectangle. Je cours actuellement l'exemple de http://cairographics.org/tutorial/ et l'alimentant les caractères spéciaux que je veux rendre.Rendu de caractères asiatiques en utilisant Cairo en C++?

#include <math.h> 
#include <stdio.h> 
#include <cairo.h> 

int 
main (int argc, char *argv[]) 
{ 
//CODE FROM http://cairographics.org/tutorial/textextents.c 
    /* Variable declarations */ 
    cairo_surface_t *surface; 
    cairo_t *cr; 
    double x, y, px, ux=1, uy=1, dashlength; 
    char text[]= u8"と"; 
    cairo_font_extents_t fe; 
    cairo_text_extents_t te; 

    /* Prepare drawing area */ 
    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 240); 
    cr = cairo_create (surface); 
    /* Example is in 26.0 x 1.0 coordinate space */ 
    cairo_scale (cr, 240, 240); 
    cairo_set_font_size (cr, 0.5); 

    /* Drawing code goes here */ 
    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); 
    cairo_select_font_face (cr, "Sans", 
      CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); 
    cairo_font_extents (cr, &fe); 

    cairo_device_to_user_distance (cr, &ux, &uy); 
    if (ux > uy) 
     px = ux; 
    else 
     px = uy; 
    cairo_font_extents (cr, &fe); 
    cairo_text_extents (cr, text, &te); 
    x = 0.5 - te.x_bearing - te.width/2; 
    y = 0.5 - fe.descent + fe.height/2; 

    /* baseline, descent, ascent, height */ 
    cairo_set_line_width (cr, 4*px); 
    dashlength = 9*px; 
    cairo_set_dash (cr, &dashlength, 1, 0); 
    cairo_set_source_rgba (cr, 0, 0.6, 0, 0.5); 
    cairo_move_to (cr, x + te.x_bearing, y); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_move_to (cr, x + te.x_bearing, y + fe.descent); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_move_to (cr, x + te.x_bearing, y - fe.ascent); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_move_to (cr, x + te.x_bearing, y - fe.height); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_stroke (cr); 

    /* extents: width & height */ 
    cairo_set_source_rgba (cr, 0, 0, 0.75, 0.5); 
    cairo_set_line_width (cr, px); 
    dashlength = 3*px; 
    cairo_set_dash (cr, &dashlength, 1, 0); 
    cairo_rectangle (cr, x + te.x_bearing, y + te.y_bearing, te.width, te.height); 
    cairo_stroke (cr); 

    /* text */ 
    cairo_move_to (cr, x, y); 
    cairo_set_source_rgb (cr, 0, 0, 0); 
    cairo_show_text (cr, text); 

    /* bearing */ 
    cairo_set_dash (cr, NULL, 0, 0); 
    cairo_set_line_width (cr, 2 * px); 
    cairo_set_source_rgba (cr, 0, 0, 0.75, 0.5); 
    cairo_move_to (cr, x, y); 
    cairo_rel_line_to (cr, te.x_bearing, te.y_bearing); 
    cairo_stroke (cr); 

    /* text's advance */ 
    cairo_set_source_rgba (cr, 0, 0, 0.75, 0.5); 
    cairo_arc (cr, x + te.x_advance, y + te.y_advance, 5 * px, 0, 2 * M_PI); 
    cairo_fill (cr); 

    /* reference point */ 
    cairo_arc (cr, x, y, 5 * px, 0, 2 * M_PI); 
    cairo_set_source_rgba (cr, 0.75, 0, 0, 0.5); 
    cairo_fill (cr); 

    /* Write output and clean up */ 
    cairo_surface_write_to_png (surface, "textextents.png"); 
    cairo_destroy (cr); 
    cairo_surface_destroy (surface); 

    return 0; 
} 

Je me rends compte que les caractères en C++ ne sont que 8 bits et ne peut attendre d'étendre à l'ensemble des caractères spéciaux, je suis en train de rendre, pour ainsi obtenir ce travail que je dois représenter les caractères spéciaux dans un autrement?

Voici l'image que je reçois quand je lance le code: Rendition of と

Alors, comment puis-je rendre des caractères spéciaux au Caire? Ai-je besoin d'utiliser Pango à la place, ou ma représentation en C++ est-elle fondamentalement incorrecte?

caractères normaux comme « a » et « á » afficher correctement

J'ai réussi à obtenir des caractères pour rendre un widget GtkDrawingArea en utilisant Pango, donc cela semble être un problème avec le Caire.

+0

Le lien est mort. – oldtechaa

+0

c'est un lien direct vers le code C. Je le mets à jour pour afficher le site Web – Arlington

+0

Avez-vous installé les bonnes polices de caractères? –

Répondre

1

Selon the Cairo documentation, il n'est pas recommandé d'utiliser Cairo pour la manipulation de texte. Ils le décrivent comme une API de texte de jouet, et recommandent l'utilisation de Pango pour le texte, comme vous l'avez déjà mentionné la possibilité de le faire. Je ne peux pas dire avec certitude que c'est votre problème, mais dans la description sur la page liée, il est dit que Cairo ne gère pas bien les problèmes de polices. Votre police sélectionnée peut ne pas supporter ce caractère.