Probleme mit Ausgabe von Umlauten GTK+-Programm

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Probleme mit Ausgabe von Umlauten GTK+-Programm

Beitrag von 3VAD_YNCAL » Sa Jun 30, 2012 7:55 pm

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ß

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Beitrag von Xin » So Jul 01, 2012 9:40 am

Versuch mal das UTF-Zeichen 0xC3A4 statt ä.

"Timer l\xC3\xA4uft"
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Beitrag von 3VAD_YNCAL » So Jul 01, 2012 12:56 pm

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?

hofian
Beiträge: 62
Registriert: Do Sep 24, 2009 6:59 pm

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Beitrag von hofian » So Jul 01, 2012 1:57 pm

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.

3VAD_YNCAL
Beiträge: 51
Registriert: So Dez 04, 2011 3:14 am

Re: Probleme mit Ausgabe von Umlauten GTK+-Programm

Beitrag von 3VAD_YNCAL » So Jul 01, 2012 11:47 pm

Hallo hofian,

wow - vielen Dank. Es funktioniert. :)

Grüße Dave ;)

Antworten