Seite 1 von 1

Probleme mit Ausgabe von Umlauten GTK+-Programm

Verfasst: Sa Jun 30, 2012 7:55 pm
von 3VAD_YNCAL
Hallo zusammen,

ich bräuchte wieder ein Mal Hilfe von euch.
Ich habe nun angefangen mich mit GUI-Programmierung in C zu beschäftigen. Mit Gtk+.
Derzeit befasse ich mich allerdings noch mit GLib.
Nun ist mir aufgefallen, dass deutsche Umlaute nicht funktionieren. Zumindest bei Konsolenprogrammen nicht.
Erstelle ich ein Fenster mit Labels, Buttons usw. werden Umlaute problemlos angezeigt.
Als OS nutze ich Ubuntu 12.04. LTS. C-Code schreibe ich mit gedit UTF-8-Format. Gtk+-Version ist 3.4.2.
Woran könnte das liegen? Folgendes Listing beispielsweise gibt anstatt 'Timer läuft' 'Timer l?uft' aus. :?:

Code: Alles auswählen

/* -*-coding: utf-8;-*- */
/* glib7.c */
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>

/* kompilieren: gcc -Wall -o glib7 glib7.c `pkg-config --libs --cflags gtk+-3.0` */

int main()
{
    GTimer  *timer = NULL;
    gdouble time;
    gulong  us;
    gint    i = 300000000;
    gint    j = 300000000;

    /* Timer erzeugen */
    /* GTimer *g_timer_new(); */
    timer = g_timer_new();

    /* Timer starten */
    /* void g_timer_start( GTimer *timer ); */
    g_timer_start( timer );
    g_print( "Timer läuft\n" );

    while( i-- );

    /* Zeit abfragen (Sekunden und Millisekunden), die seit dem Start *
     * des Timers vergangen ist					      */
    /* gdouble g_timer_elapsed( GTimer *timer, gulong *msecs ); */
    time = g_timer_elapsed( timer, &us );
    g_print( "Schleife dekrementiert %g sek == %ld usek\n", time, us );

    /* die abgelaufene Zeit auf 0 zurücksetzen (und neustarten) */
    /* void g_timer_reset( GTimer *timer); */
    g_timer_reset( timer );

    while( i++ <= j );

    time = g_timer_elapsed( timer, &us );
    g_print( "Schleife inkrementiert %g sek == %ld usek\n", time, us );
    g_timer_reset( timer );

    g_print( "Timer von Hand starten <ENTER>\n" );
    getchar();
    g_timer_start( timer );

    g_print( "Timer von Hand stoppen <ENTER>\n" );
    getchar();
    /* Timer stoppen */
    /* g_timer_stop( GTimer *stop ); */
    g_timer_stop( timer );

    time = g_timer_elapsed( timer, &us );
    g_print( "Vergangene Zeit zwischen Start und Stopp"
	     " %g sek == %ld usek\n", time, us );

    /* Timer zerstören (freigeben) */
    /* void g_timer_destroy(GTimer *timer); */
    g_timer_destroy( timer );

    return 0;
}
Bin ratlos. Habt ihr mir vielleicht ein Tipp?

Gruß

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Verfasst: So Jul 01, 2012 9:40 am
von Xin
Versuch mal das UTF-Zeichen 0xC3A4 statt ä.

"Timer l\xC3\xA4uft"

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Verfasst: So Jul 01, 2012 12:56 pm
von 3VAD_YNCAL
Hallo Xin,

erstmals vielen Dank für deine Antwort - doch leider klappt das auch nicht. Es verhält sich genauso - als würde man direkt 'läuft' im Quellcode benutzen.

Mir ist aufgefallen, dass die Umlaute nur dann richtig angezeigt werden, wenn man GTK initialisiert -> also

Code: Alles auswählen

gtk_init( &argc, &argv );
Macht ja aber wenig Sinn wenn es eine Konsolenanwendung werden soll. Will man also ein Konsolenprogramm schreiben (ohne GUI) und die Glib gerne nutzen, ist das echt ein Problem. :?

Dafür muss es doch eine Lösung geben, oder?

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Verfasst: So Jul 01, 2012 1:57 pm
von hofian
Du musst den aktuellen System-Locale setzen, um Unicode Zeichen mit g_print ausgeben zu können (oder du nutzt einfach printf aus stdio.h). g_print konvertiert nämlich nicht allein zu UTF-8, sondern nur bei gesetzter UTF-8-Locale.

Das geht ganz einfach mit:

Code: Alles auswählen

#include <locale.h>

...

setlocale (LC_ALL, "");
Das setzt den Locale der C-Library auf die aktuelle System-Locale (mit "echo $LANG" kannst du diese in der Konsole auslesen). Damit bringst du g_print dazu, die Zeichenfolge zu UTF-8 zu konvertieren. gtk_init macht diesen Schritt auch.

Siehe GNOME-Dokumentation

Hoffe das hilft.

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Verfasst: So Jul 01, 2012 11:47 pm
von 3VAD_YNCAL
Hallo hofian,

wow - vielen Dank. Es funktioniert. :)

Grüße Dave ;)