首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在glib中打印utf8

在glib中打印utf8
EN

Stack Overflow用户
提问于 2010-06-22 18:51:11
回答 4查看 6.3K关注 0票数 9

为什么不能通过glib函数打印utf8符号?

源代码:

代码语言:javascript
复制
#include "glib.h"
#include <stdio.h>

int main() {
    g_print("марко\n");
    fprintf(stdout, "марко\n");
}

像这样构建它:

代码语言:javascript
复制
gcc main.c -o main $(pkg-config glib-2.0 --cflags --libs)

您可以看到glib不能打印utf8,而fprintf可以:

代码语言:javascript
复制
[marko@marko-work utf8test]$ ./main 
?????
марко
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-22 19:14:20

fprint函数假定您用它们打印的每个字符串都经过了正确的编码,以匹配您的终端的当前编码。g_print()不会假设这一点,如果它认为有必要的话,它会转换编码;当然,如果编码以前实际上是正确的,那么这是一个坏主意,因为这很可能会破坏编码。您的终端的区域设置是什么?

您可以在大多数系统上通过环境变量设置正确的语言环境,也可以使用setlocale函数以编程方式设置语言环境。区域设置名称依赖于系统(不是POSIX标准的一部分),但在大多数系统上都可以使用以下方法:

代码语言:javascript
复制
#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();区域设置永远不会因为其他例程的副作用而改变。

票数 10
EN

Stack Overflow用户

发布于 2010-06-23 08:36:25

您需要通过在程序开始时调用setlocale来初始化区域设置的编码。

代码语言:javascript
复制
setlocale(LC_CTYPE, "")

如果您使用一些初始化函数,如gtk_init(..)或类似函数,则通常会执行此操作。

票数 2
EN

Stack Overflow用户

发布于 2010-06-22 19:10:45

从g_print()传递到glibc的字符串不一定是UTF8编码的,因为g_print()会将字符集转换为区域设置指定的字符集。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3092354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档