【发布时间】:2020-07-14 14:28:28
【问题描述】:
int insnstr(const char *str, int n);
假设libncursesw使用,n是什么?是 (a) 字节数、(b) 代码点 (wchar_t) 数、(c) 字形 (cchar_t) 数还是 (d) 屏幕列数?
(如果某些 cchar_t 的 unicode 宽度 > 1 并占用多列,则 (d) 情况与 (c) 情况不同。)
【问题讨论】:
int insnstr(const char *str, int n);
假设libncursesw使用,n是什么?是 (a) 字节数、(b) 代码点 (wchar_t) 数、(c) 字形 (cchar_t) 数还是 (d) 屏幕列数?
(如果某些 cchar_t 的 unicode 宽度 > 1 并占用多列,则 (d) 情况与 (c) 情况不同。)
【问题讨论】:
首先,看起来(6.2 ncurses 源代码)insnstr 被定义为调用winsnstr 的宏。 winsnstr() 在 ncurses/base/lib_insnstr.c 中定义。在那里,在 USE_WIDEC_SUPPORT 守卫内,ncurses 执行由 n 绑定的 mbstowcs。该结果被输入到 wins_nwstr() 中。
因此,在这种情况下,n 似乎限制了进入 mbstowcs() 的字节数。 mbstowcs() 想要整个多字节序列(不是中断的)。所以在这种情况下,n 似乎仍然表示字节数,并且应该出现在多字节边界上。
【讨论】: