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:
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.
Le lien est mort. – oldtechaa
c'est un lien direct vers le code C. Je le mets à jour pour afficher le site Web – Arlington
Avez-vous installé les bonnes polices de caractères? –