【发布时间】:2025-12-26 20:20:14
【问题描述】:
我正在尝试在 C 程序中显示一些 unicode 字符。一个工作的 MWE 如下所示:
#include <ncurses.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <locale.h>
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
initscr(); // Initialize stdscr
for(int x = 0; x < 20; x++)
{
switch (x%5)
{
case 0:
mvaddstr(1, x, "\u2588");
break;
case 1:
mvaddstr(1, x, "\u2593");
break;
case 2:
mvaddstr(1, x, "\u2592");
break;
case 3:
mvaddstr(1, x, "\u2591");
break;
case 4:
mvaddstr(1, x, " ");
break;
}
}
mvprintw(3, 0, "Press ANY KEY to finish");
refresh();
int ch = getch();
endwin();
return 0;
}
编译使用gcc -o shades shades.c -lncursesw。它可以正常编译并正确显示阴影,如下图所示。
但是使用case/switch 语句,我想将我的字符放入十六进制代码的array 中并对其进行迭代。正如下面的可耻尝试。
#include <ncurses.h>
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
initscr(); // Initialize stdscr
uint shades[5] = { 0x2588,
0x2593,
0x2592,
0x2591,
' '};
char utfchar[7];
for(int x = 0; x < 20; x++)
{
sprintf(utfchar, "\\u%04x", shades[x%5]);
mvaddstr(1, x, utfchar);
}
mvprintw(3, 0, "Press ANY KEY to finish");
refresh();
int ch = getch();
endwin();
return 0;
}
这里我使用sprintf 将十六进制值转换为格式为\u0000 的字符串,其中0000 是正确的十六进制值。然后我像在之前的代码中一样使用mvaddstr,因为mvaddstr 在第三个参数中需要const char *。
这是众多失败的尝试之一。我无法以 unicode 格式正确复制字符串,当我尝试添加 unicode 内容时,也无法将变量用作mvaddstr 的参数。
我想知道如何从 uint 有效的 unicode 十六进制值格式化支持 unicode 的 const char * 以将其插入到 mvaddstr?
PS:我在 Linux 中使用的不是 C++,而是纯 C。 C++ 解决方案不是解决方案
【问题讨论】:
-
也许将数组更改为
const char * shades[5] = { "\u2588", "\u2593", "\u2592", "\u2591", ""}; -
对字符串和字符中的转义序列(如
"\u2588")的解析是在编译时由编译器自己完成的。您不能在运行时创建转义序列。至于什么例如"\u2588"正在做,它只是将十六进制数0x2588插入到字符串中(字节顺序不确定)。 -
C 中没有函数可以将十六进制值编码为有效的 unicode?无论如何,使用
const char数组的想法是可行的。但是由于字符值是在我的代码中半动态生成的。我希望能够在运行时将十六进制值 encode 转换为有效的 unicode 字符。 -
您可以使用
wchar函数,只要您的系统和语言环境期望wchar保存一个unicode 代码点。 Ncurses 具有广泛的字符支持;例如,参见*.com/questions/15222466/…。