6

在过去的一周里,我一直在和一个朋友一起用 C++ 开发一个roguelike游戏。主要也是学习语言。

我正在使用:

  • 诅咒
  • 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特定的方法来做到这一点吗?

4

4 回答 4

2

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

于 2009-11-12T20:46:53.957 回答
2

您需要正确设置代码页。这里有一篇很好的文章:链接

于 2009-11-12T20:48:44.123 回答
2

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

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

我能想到的最佳解决方案是使用特殊构造的Shell Link (.LNK) 文件启动控制台。如果您阅读文件格式文档,您会看到它允许您指定字体。

但你的问题还不止于此。Windows 的西方语言环境安装提供Lucida Console,但该字体仅提供有限的字形子集。我假设您可以在日文 Windows PC 上的控制台中输出/输入日文文本。如果您想确保它可以在那里工作,您需要检查日语 Windows 上可用的内容。

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

于 2009-11-12T23:09:49.093 回答
1

虽然这是一个相当大的开关,但您可以尝试使用替代控制台,特别是如果您正在玩 roguelike。libtcod是一个中等流行的库,用 C 语言编写,带有 C++ 绑定,它提供了一个全彩色控制台,您可以在其中设置自己的字体和字形。这应该给您更多的灵活性,而不是拘泥于 Windows 控制台给您的东西.

于 2012-01-23T19:50:09.307 回答