我在使用C标准库格式化函数(如sprintf())处理包含非ASCII字符的UTF-8字符串时发现了一个有趣的问题:
printf()系列的功能不知道utf-8并根据字节数而不是字符处理所有内容.因此格式不正确.
简单的例子:
#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;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
Result="|Täää|", len=7
Run Code Online (Sandbox Code Playgroud)
很可能你们中的一些人会建议将应用程序从char转换为wchar_t并使用fwprintf()等,但由于现有的巨大应用程序,这绝对是不可能的.我可以想象编写一个在内部使用这些函数的包装器,但这会非常棘手并且非常低效.
因此,最好的解决方案是替换标准C库的格式化功能的UTF-8.
目前我正在研究QNX 6.4,但回复其他操作系统.例如Linux,也非常受欢迎.