2016-03-31 6 views
1

Ich versuche ein Programm zu schreiben, das asiatische Zeichen in UTF-8 rendert. Wenn ich versuche, das Zeichen in einer Terminal- oder Texteditorumgebung darzustellen, wird es korrekt gerendert. Wenn ich versuche, in Kairo zu rendern, bekomme ich in meiner Ausgabe Rechtecke gerendert (nicht das erwartete UTF8-Zeichen).Asiatische Zeichen mit Cairo in C++ wiedergeben?

Unten ist ein Beispielcode, den ich ausführe, der eine PNG-Dateiausgabe mit dem gerenderten Text erzeugt. Wenn ich in gcc kompiliere und den Code ausführe, bekomme ich nicht das erwartete Zeichen, sondern ein Rechteck. Ich führe gerade das Beispiel von http://cairographics.org/tutorial/ und füttere es die Sonderzeichen, die ich rendern möchte.

#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; 
} 

Mir ist klar, dass die Zeichen in C++ sind nur 8 Bit und nicht erwartet werden können, um den speziellen Zeichensatz zu verlängern ich zu machen versuchen, so dass diese an der Arbeit brauche ich die Sonderzeichen in einem darzustellen anders? Hier

ist das Bild, das ich erhalte, wenn ich den Code ausführen: Rendition of と

So wie kann ich machen Sonderzeichen in Kairo? Muss ich stattdessen Pango verwenden oder ist meine Darstellung in C++ grundsätzlich falsch?

normale Zeichen wie ‚a‘ und ‚a‘ machen richtig

Ich habe es geschafft, einige Zeichen zu bekommen auf einem GtkDrawingArea Widget machen Pango verwendet wird, so scheint dies ein Problem mit Kairo zu sein.

+0

Der Link ist tot. – oldtechaa

+0

das ist eine direkte Verbindung zum C-Code. Ich aktualisiere es, um die Website zu zeigen – Arlington

+0

Haben Sie die richtigen Schriftarten installiert? –

Antwort

1

Gemäß the Cairo documentation wird nicht empfohlen, Cairo für Textmanipulation zu verwenden. Sie beschreiben es als eine Spielzeug-Text-API und empfehlen die Verwendung von Pango für Text, wie Sie bereits erwähnt haben. Ich kann nicht mit Sicherheit sagen, dass dies dein Problem ist, aber in der Beschreibung auf der verlinkten Seite steht, dass Kairo Schriftprobleme nicht gut behandelt. Die ausgewählte Schriftart unterstützt dieses Zeichen möglicherweise nicht.

Verwandte Themen