【发布时间】:2019-11-07 10:04:08
【问题描述】:
我正在尝试使用 printf 函数在 C 代码 (char *) 中格式化一些 utf-8 编码的字符串。我需要指定格式的长度。当参数字符串中没有多字节字符时一切正常,但是当数据中有一些多字节字符时,结果似乎不正确。
我的 glibc 有点旧(2.17),所以我尝试了一些在线编译器,结果是一样的。
#include <stdlib.h>
#include <locale.h>
int main(void)
{
setlocale( LC_CTYPE, "en_US.UTF-8" );
setlocale( LC_COLLATE, "en_US.UTF-8" );
printf( "'%-4.4s'\n", "elephant" );
printf( "'%-4.4s'\n", "éléphant" );
printf( "'%-20.20s'\n", "éléphant" );
return 0;
}
Result of execution is :
'elep'
'él�'
'éléphant '
第一行正确(输出 4 个字符)
第二行显然是错误的(至少从人类的角度来看)
最后一行也是错误的:只写了 18 个 unicode 字符而不是 20 个
似乎 printf 函数在 UTF-8 解码之前计数字符(计数字节而不是 unicode 字符)
这是 glibc 中的错误还是 printf 有据可查的限制?
【问题讨论】:
标签: gcc unicode utf-8 printf glibc