處理含非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