处理含非ASCII字符用类似的sprintf)C标准库格式化功能(UTF8字符串时,我发现了一个有趣的问题printf()系列不知道utf-8并根据字节数处理所有内容,而不是字符。因此格式不正确。寻找如printf()UTF8感知格式化功能等
简单的例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
const char* testMsg = "Tääääßt";
char buf[1024];
int len;
sprintf(buf, "|%7.7s|", testMsg);
len = strlen(buf);
printf("Result=\"%s\", len=%d", buf, len);
return 0;
}
结果是:
Result="|Täää|", len=7
最有可能有些人会向推荐应用从字符转换成wchar_t的和使用fwprintf()等,但由于现有的巨大应用程序,这绝对不可能。我可以想象写一个内部使用这些函数的包装器,但这会很棘手,效率很低。
所以最好的解决方案是标准C库格式化函数的UTF-8感知替换。
目前我正在使用QNX 6.4,但对其他操作系统的答复。例如Linux,也非常受欢迎。
您的示例输出省略了前导'|'性格,这似乎不太可能反映真正发生的事情。 – unwind 2012-02-17 09:12:09
@unwind你是对的,thanx。固定。 – 2012-02-17 09:13:27
您可以使用Unicode库(如http://www.flexiguided.de/publications.utf8proc.en.html),并为Unicode字符串提供'printf'字节数? – trojanfoe 2012-02-17 09:15:46