在Windows终端中输出Unicode字符

7
在过去的一周里,我和一个朋友一起使用C++制作了一款Roguelike游戏,主要是为了学习这门语言。
我使用以下工具: 我可以在控制台中输出类型的字符。我成功地输出了一些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特定的方法?


2
你读过Spolsky的《关于Unicode和字符集,每个软件开发人员绝对必须知道的绝对最低限度(无任何借口!)》吗?显然,如果你在处理字符集方面工作,那么在下一次呼吸之前,你应该阅读这篇文章:http://www.joelonsoftware.com/articles/Unicode.html - Ben McCormack
我有一些字符集方面的经验,但没有读过那篇特定的文章。我会去看看,谢谢你的提示 :) - Martin Nycander
4个回答

2

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


我需要依赖用户来完成这个任务吗?还是我可以在应用程序内强制更改字体? - Martin Nycander
+1,这确实是情况,尽管解决方案只适用于开发机:/ - Martin Nycander

2

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


我不喜欢使用特定于平台的方法,但我尝试使用 SetConsoleCP(65001); 来获取 UTF-8... 没有成功。 - Martin Nycander

2
问题是我需要强制终端切换到一个更多Unicode字体的字体。有跨平台的方法吗?甚至有Windows特定的方法吗?
我查了一下,但没有找到一个Windows API调用来做到这一点(当然可能只是我没找到)。我不会期望找到一个跨平台的方法。
我能想到的最好的解决方案是使用一个特殊构造的Shell Link (.LNK)文件启动控制台。如果你阅读文件格式文档,你会看到它允许你指定一个字体。
但是你的问题并不止于此。在西方区域安装的Windows系统中,提供了Lucida Console字体,但该字体仅提供了有限的字符集。我假设您可以在日本Windows PC上的控制台中输出/输入日语文本。如果您想确保它能在那里正常工作,您需要检查日本Windows上可用的内容。

Linux(至少在Ubuntu上)似乎在这方面有更好的支持,使用UTF-8,并提供具有广泛字符集支持的字体。我还没有检查其他发行版,看看情况如何,也没有检查终端中字体是如何解析的(无论是X事物、Gnome事物还是其他)。


我还没有尝试创建Shell链接,因为我们必须解决一些问题。但是,这个回复很好地回答了我的问题。谢谢 :) - Martin Nycander

1

虽然这是一个相当大的转变,但如果你正在制作类似Roguelike的游戏,你可以尝试使用替代控制台。libtcod是一个相对流行的库,用C语言编写并带有C++绑定,提供了一个全彩色控制台,你可以在其中设置自己的字体和字形。这应该比被Windows控制台限制要灵活得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接