过去一周我一直在研究一个 Roguelike 和朋友一起玩C++游戏。主要也是学习语言。

我在用着:

  • 诅咒
  • Windows 7的
  • 视觉工作室 C++

输出 wchar_t位于控制台中我想要的任何位置。我已经成功地输入了一些 unicode 字符,例如 \u263B (☻),但其他字符,例如 \u2638 (☸) 最终只会显示为问号 (?)。

这是我用于输出的相关代码。

// Container of room information

struct RoomInfo
{
    wchar_t * layout;
    int width;
    int height;
};

// The following function builds RoomInfo 

RoomInfo Room::examine(IActor * examinor)
{
    RoomInfo ri;
    ri.width = this->width;
    ri.height = this->height;
    ri.layout = new wchar_t[height * width];
    for(unsigned int y = 0; y < height; y++)
    {
        for(unsigned int x = 0; x < width; x++)
        {
            ri.layout[y*width + x] = L'\u263B'; // works
            //ri.layout[y*width + x] = L'\u2638'; // will not work
        }
    }
}

// The following function outputs RoomInfo

void CursesConsole::printRoom(RoomInfo room)
{
    int w = room.width;
    int h = room.height;

    WINDOW * mapw = newwin(h, w, 1, 0);
    for(int y = 0; y < h; y++)
    {
        wmove(mapw, y, 0);
        for(int x = 0; x < w; x++)
        {
            int c = y*w + x;
            waddch(mapw, room.layout[c]);
        }
    }

    wrefresh(mapw);
    delwin(mapw);
}

我当然可以依靠无聊的 ANSI 字符。但如果能使用完整的 unicode 字符集那就太棒了。

把它们加起来: 如何确保unicode字符正确输出?


编辑:

好的,所以我发现我的编码工作正常。问题是 我需要强制终端切换到更丰富的 unicode 字体. 。有没有跨平台的方法来做到这一点?有没有一种特定于 Windows 的方法可以做到这一点?

有帮助吗?

解决方案

问题是我需要强制终端切换到更丰富的 unicode 字体。有没有跨平台的方法来做到这一点?有没有一种特定于 Windows 的方法可以做到这一点?

我查了一下,但找不到 Windows API 调用来执行此操作(当然,这可能意味着我没有找到它)。我不希望找到一种跨平台的方法来做到这一点。

我能想到的最好的解决方案是使用专门构造的启动控制台 外壳链接 (.LNK) 文件。如果您阅读了 文件格式文档, ,您会看到它允许您指定字体。

但你的问题还不止于此。Windows 的西方语言环境安装提供 露西达控制台, ,但该字体仅提供有限的字素子集。我假设您可以在日语 Windows PC 上的控制台中输出/输入日语文本。如果您想确保它可以在日语 Windows 上运行,您需要检查哪些功能可以在日语 Windows 上使用。

Linux(至少是 Ubuntu)似乎在这里有更好的支持,使用 UTF-8 并提供具有广泛字形支持的字体。我没有检查其他发行版来了解其中的故事,也没有检查字体在终端中是如何解析的(无论是 X 的东西,Gnome 的东西还是其他什么)。

其他提示

原则上,控制台支持所有 unicode 字符。您看到问号的事实可能与这些字符的字体支持有关。尝试将控制台字体切换为具有良好 unicode 支持的字体。

您需要正确设置代码页。这里有一篇关于此的非常好的文章: 关联

虽然这是一个相当大的切换,但您可以尝试使用替代控制台,特别是如果您正在玩 Roguelike 游戏。 库文件 是一个相当流行的库,用 C 语言编写,并带有 C++ 绑定,它提供了一个全彩色控制台,您可以在其中设置自己的字体和字形。这应该会给你带来更多的灵活性,而不是受制于 Windows 控制台所提供的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top