"Red Heart ❤️" ncurses 中的 unicode 字符

"Red Heart ❤️" unicode character in ncurses

目前使用 WSL2、C++20,带有预处理器指令 #define _XOPEN_SOURCE_EXTENDED 1#include <panel.h> 和标志 -lpanelw -lncursesw

当我尝试在 ncurses 中添加“红心❤️”字符时使用下面提供的代码,它会导致终端出现奇怪的错误 window,尤其是当我用盒子包裹它时。我的 MacBook 也遇到了同样的问题。当我将 unicode 字符放入字符串 "❤️" 中时,它会给出 const char[7],这与给出 const char[5] 的许多其他 unicode 字符相反。这可能与错误的原因有关吗?如果有人能给我一些关于这个问题的见解,我将不胜感激。

(忽略部分图片右下角的光标,那只是VS Code终端的光标问题)

1 颗红心:

2 颗红心:

2 颗紫心勋章:

代码:

#define _XOPEN_SOURCE_EXTENDED 1

#include <panel.h>
#include <iostream>

int main() {
    setlocale(LC_ALL, "");
    initscr();
    raw();
    noecho();
    curs_set(0);
    refresh();
    
    WINDOW *win {newwin(8, 16, 10, 10)};
    box(win, 0, 0);
    mvwaddwstr(win, 1, 1, L"❤️");
    mvwaddwstr(win, 1, 5, L"❤️");
    wrefresh(win);

    getch();
    endwin();
}

您使用的“字”“❤️”其实不是一个字。它由两个 Unicode 字符“❤”(U+2764) 和一个修饰符 U+FE0F“VARIATION SELECTOR-16”组成,它给出了表情符号的红色样式。

您可以通过在 WSL 控制台中键入 echo -n ❤️ | hexdump -C 来验证字符串的编码形式,它应该输出

00000000  e2 9d a4 ef b8 8f                                 |......|
00000006 

或 Python,

In [1]: heart="❤️"

In [2]: len(heart)
Out[2]: 2

In [3]: hex(ord(heart[0]))
Out[3]: '0x2764'

In [4]: hex(ord(heart[1]))
Out[4]: '0xfe0f'

更多关于 Variation Selectors