在Windows终端中输出unicode字符

时间:2009-11-12 20:41:41

标签: c++ windows unicode curses wchar-t

过去一周,我和朋友一起用C ++进行roguelike游戏。大部分都是学习语言。

我正在使用:

在控制台中输出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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

  

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

我看过这个,但找不到一个Windows API调用(当然这可能只是意味着我找不到它)。我不希望找到一种跨平台的方式来实现它。

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

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

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

答案 3 :(得分:1)

虽然这是一个非常大的开关,但你可能会尝试使用另一种控制台,特别是如果你正在做一个roguelike。 libtcod是一个中等流行的库,用C语言编写,带有C ++绑定,它提供了一个全彩色的控制台,你可以设置自己的字体和字形。这应该比你坚持使用的更具灵活性。 Windows控制台为您提供。