【问题标题】:"Red Heart ❤️" unicode character in ncursesncurses中的“红心❤️”Unicode字符
【发布时间】:2021-12-16 14:47:42
【问题描述】:

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

当我尝试在 ncurses 中添加“Red Heart ❤️”字符时,使用下面提供的代码会导致终端窗口出现奇怪的错误,尤其是当我用框将其封装时。我的 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();
}

【问题讨论】:

  • 在新的 Windows 终端中是否会发生同样的错误? github.com/microsoft/terminal
  • Windows 终端中似乎没有出现该错误。有没有办法为其他有bug的终端解决这个问题?

标签: c++ unicode ncurses


【解决方案1】:

您使用的“字符”“❤️”实际上并不是单个字符。它由两个 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

【讨论】:

  • 当我使用您提供的命令时,我得到了这个:0000000 9de2 efa4 8fb8 000a 0000007 我猜它是一样的,只是字节序不同?
  • 如果它是字节序是有道理的,但这并不重要,因为我只是想表明这个符号有两个 Unicode 字符。
  • 我按照建议尝试了echo ❤️ | hexdump。结果在我的情况下也像@Locklan 报道的那样。要实现您所描述的,应该是echo ❤️ | hexdump -C(或者更好的echo -n ❤️ | hexdump -C)。 @Locklan:这种 UTF-8 编码(由字节组成) - 即不可能存在字节顺序问题。
  • @Scheff'sCat 感谢-C 的推荐。我正在使用 BSD hexdump,因此存在差异。自从 OP 在 WSL 上运行后,我将更改我的答案。
  • 这是一个有趣的答案,关于我过去完全错过的 Unicode 的一个细节。 (也许,因为我在日常业务中不需要红心 - 在为工程师制作软件时。);-) 我希望你能获得接受的答案复选标记(恕我直言,你的答案应得的)。你已经得到了我的支持。
猜你喜欢
  • 2020-08-31
  • 2016-04-04
  • 1970-01-01
  • 2017-10-05
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2016-08-07
相关资源
最近更新 更多