我有一个ncurses项目,我使用mvwprintw将长字符串打印到窗口。
mvwprintw(traceview_window_flatprofile, 1, 0, "%s", flatprofile_as_str());
结果如下:
% self children self children
time time time calls /call /call name
39.86 886 µs 0 ns 32 27697 ns 0 ns addr_translate [13]
25.69 571 µs 1454 µs 1 571 µs 1454 µs main [0]
7.02 156 µs 0 ns 1 156 µs 0 ns addr_fini [66]
6.28 139 µs 55006 ns 1 139 µs 55006 ns addr_init [2]
3.83 85094 ns 21956 ns 2 42547 ns 10978 ns flatprofile_snprintf [43]
2.08 46150 ns 0 ns 1 46150 ns 0 ns addr_read_symbol_table [3]
当我使用
将相同的字符串打印到stderr时fprintf(stderr, "%s\n", flatprofile_as_str());
结果如下:
% self children self children
time time time calls /call /call name
39.86 886 µs 0 ns 32 27697 ns 0 ns addr_translate [13]
25.69 571 µs 1454 µs 1 571 µs 1454 µs main [0]
7.02 156 µs 0 ns 1 156 µs 0 ns addr_fini [66]
6.28 139 µs 55006 ns 1 139 µs 55006 ns addr_init [2]
3.83 85094 ns 21956 ns 2 42547 ns 10978 ns flatprofile_snprintf [43]
2.08 46150 ns 0 ns 1 46150 ns 0 ns addr_read_symbol_table [3]
你知道可能导致这种差异的原因吗?
编辑:除了下面的答案,以下问题解决了相关问题 How to make ncurses display UTF-8 chars correctly in C?
答案 0 :(得分:1)
差异似乎是由特殊字符μ引起的,我不太确定如何修复它,但您可能需要调整flatprofile_as_str()
函数。
我记得有一个与utf-8的特殊字符类似的问题,我通过使用这个函数计算不是字节而是计算字符串的实际长度来解决它:
int strlen_utf8(char *s) {
int i = 0, j = 0;
while (s[i]) {
if ((s[i] & 0xc0) != 0x80) j++;
i++;
}
return j;
}