Why utf8 symbols cannot be printed via glib functions?
Source code:
#include "glib.h"
#include <stdio.h>
int main() {
g_print("марко\n");
fprintf(stdout, "марко\n");
}
Build it like this:
gcc main.c -o main $(pkg-config glib-2.0 --cflags --libs)
You could see that glib can’t print utf8 and fprintf can:
[marko@marko-work utf8test]$ ./main
?????
марко
fprint functions assume that every string you print with them is correctly encoded to match the current encoding of your terminal. g_print() does not assume that and will convert the encoding if it thinks that is necessary; of course this is a bad idea, if the encoding was actually correct before, since that will most likely destroy the encoding. What is the locale setting of your terminal?
You can either set the correct locale by environment variables on most systems or you can do it programatically using the setlocale function. The locale names are system dependent (not part of the POSIX standard), but on most systems the following will work:
Instead of LC_ALL you can also only set the locale for certain operations (e.g. “en_US” will cause English number and date formatting, but maybe you don’t want numbers/dates to be formatted that way). To quote from the setlocale man page:
The only two locale values that are always available on all systems are “C”, “POSIX” and “”.