为什么不能通过glib函数打印utf8符号?
源代码:
#include "glib.h"
#include <stdio.h>
int main() {
g_print("марко\n");
fprintf(stdout, "марко\n");
}像这样构建它:
gcc main.c -o main $(pkg-config glib-2.0 --cflags --libs)您可以看到glib不能打印utf8,而fprintf可以:
[marko@marko-work utf8test]$ ./main
?????
марко发布于 2010-06-22 19:14:20
fprint函数假定您用它们打印的每个字符串都经过了正确的编码,以匹配您的终端的当前编码。g_print()不会假设这一点,如果它认为有必要的话,它会转换编码;当然,如果编码以前实际上是正确的,那么这是一个坏主意,因为这很可能会破坏编码。您的终端的区域设置是什么?
您可以在大多数系统上通过环境变量设置正确的语言环境,也可以使用setlocale函数以编程方式设置语言环境。区域设置名称依赖于系统(不是POSIX标准的一部分),但在大多数系统上都可以使用以下方法:
#include <locale.h>
:
setlocale(LC_ALL, "en_US.utf8");你也可以只为某些操作设置区域设置,而不是LC_ALL (例如,"en_US“会导致英文数字和日期格式,但你可能不希望数字/日期以这种方式格式化)。引用setlocale手册页的内容:
LC_ALL一般设置整个区域设置。
LC_COLLATE为字符串排序例程设置区域设置。它控制strcoll()和strxfrm()中的字母顺序。
LC_CTYPE为ctype(3)和multibyte(3)函数设置了语言环境。这控制大小写、字母或非字母字符的识别,等等。
LC_MESSAGES设置消息目录的区域设置,请参见catopen(3)函数。
LC_MONETARY设置用于格式化货币值的区域设置;这会影响localeconv()函数。
LC_NUMERIC设置用于设置数字格式的区域设置。它控制函数(如printf()和scanf() )中浮点数的输入和输出中小数点的格式,以及localeconv()返回的值。
LC_TIME使用strftime()函数设置格式化日期和时间的区域设置。
在所有系统上始终可用的唯一两个区域设置值是"C“、"POSIX”和"“。
默认情况下只定义了三种语言环境:空字符串"“(表示本机环境)以及"C”和"POSIX“语言环境(表示C语言环境)。locale参数为NULL会导致setlocale()返回当前区域设置。默认情况下,C程序以"C“语言环境启动。库中设置区域设置的唯一函数是setlocale();区域设置永远不会因为其他例程的副作用而改变。
发布于 2010-06-23 08:36:25
您需要通过在程序开始时调用setlocale来初始化区域设置的编码。
setlocale(LC_CTYPE, "")如果您使用一些初始化函数,如gtk_init(..)或类似函数,则通常会执行此操作。
发布于 2010-06-22 19:10:45
从g_print()传递到glibc的字符串不一定是UTF8编码的,因为g_print()会将字符集转换为区域设置指定的字符集。
https://stackoverflow.com/questions/3092354
复制相似问题