【问题标题】:How do I use ncurses to render Unicode the same way across different terminals?如何使用 ncurses 在不同的终端上以相同的方式呈现 Unicode?
【发布时间】:2023-09-20 02:05:01
【问题描述】:

用户 MGetz 在 this 帖子中告诉我使用 ncurses 在我的程序中呈现 unicode 级别。所以,我更新了我的代码以使用ncurses,但它在不同终端中的呈现方式仍然不同。我使用g++ file.cpp -o file -std=c++11 -lncursesw 编译了我的代码说到我的代码,就在这里。

#include <iostream>
#include <string>
#include <ncurses.h>
#include <locale.h>

using namespace std;

void PrintLevel();

string lvl[9][11] {
        {"\u250f", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2513"},
        {"\u2503", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u2503"},
        {"\u2503", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u2503"},
        {"\u2503", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u2503"},
        {"\u2503", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u2503"},
        {"\u2503", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u2503"},
        {"\u2503", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u2503"},
        {"\u2503", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u0020", "\u2503"},
        {"\u2517", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u2501", "\u251B"}
    };

int main() {
    setlocale(LC_ALL, "");
    initscr();
    PrintLevel();
    getch();
    endwin();
}

void PrintLevel() {
    for(int i = 0; i<9; i++) {
        for(int j = 0; j<11; j++) {
            printw(lvl[i][j].c_str());
            if(j == 10) {
                printw("\n");
            }
        }
    }

    refresh();
}

哦,仅供参考,我正在使用 Codenvy,因为我只能访问我的学校 Chromebook。在另一个类似 Codenvy 的服务 Codeanywhere 上尝试它,Unicode 甚至无法正确呈现,我明白了:

【问题讨论】:

    标签: c++ unicode ncurses


    【解决方案1】:

    副手:

    • 由于屏幕显示替换字符(那个看起来很奇怪的问号),人们会假设终端设置为 UTF-8,但是
    • 您正在调用setlocale 以使用区域设置,但没有提及它们是什么(LC_ALL 等,如 locale 命令所示),并且
    • 没有提及您是使用 ncursesw(预期)还是 ncurses 进行编译/链接。

    如果您有错误的区域设置并与 ncurses 链接,它可能看起来像那张图片。

    【讨论】:

    • 我更新了我的帖子以显示编译命令。如何将语言环境设置为使用 UTF-8?
    • 它是环境变量(但取决于您安装的语言环境支持)。