为什么utf8符号无法通过glib函数打印?
源代码:
#include "glib.h"
#include <stdio.h>
int main() {
g_print("?????\n");
fprintf(stdout, "?????\n");
}
Run Code Online (Sandbox Code Playgroud)
像这样构建:
gcc main.c -o main $(pkg-config glib-2.0 --cflags --libs)
Run Code Online (Sandbox Code Playgroud)
你可以看到glib无法打印utf8和fprintf可以:
[marko@marko-work utf8test]$ ./main
?????
?????
Run Code Online (Sandbox Code Playgroud)
fprint函数假定您使用它们打印的每个字符串都已正确编码,以匹配终端的当前编码.g_print()不会假设并且如果它认为有必要将转换编码; 当然,这是一个坏主意,如果之前的编码实际上是正确的,因为这很可能会破坏编码.您的终端的区域设置是什么?
您可以在大多数系统上通过环境变量设置正确的区域设置,也可以使用setlocale函数以编程方式执行.区域设置名称是系统相关的(不是POSIX标准的一部分),但在大多数系统上,以下内容将起作用:
#include <locale.h>
:
setlocale(LC_ALL, "en_US.utf8");
Run Code Online (Sandbox Code Playgroud)
除了LC_ALL之外,您还可以仅为某些操作设置区域设置(例如,"en_US"将导致英文编号和日期格式,但您可能不希望以这种方式格式化数字/日期).要引用setlocale手册页:
LC_ALL通常设置整个语言环境.
LC_COLLATE为字符串排序规则设置区域设置.这控制strcoll()和strxfrm()中的字母顺序.
LC_CTYPE为ctype(3)和多字节(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(); 区域设置永远不会被改变为其他一些例程的副作用.
| 归档时间: |
|
| 查看次数: |
5691 次 |
| 最近记录: |