在windowsterminal输出unicode字符

在过去的一周里,我和一位朋友一起在C ++上开发了一个roguelike游戏。 大多也学习语言。

我在用着:

  • pdcurses
  • Windows 7的
  • Visual Studio 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字符输出正确?


编辑:

好的,所以我想通了我的编码工作正常。 问题是, 我需要强制terminal切换到更多的Unicode字体 。 有没有跨平台的方式来做到这一点? 有甚至有一个窗口具体的方式来做到这一点?

问题是,我需要强制终端切换到更多的Unicode字体。 有没有跨平台的方式来做到这一点? 有甚至有一个窗口具体的方式来做到这一点?

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

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

但是你的问题并不止于此。 Windows的西方语言环境安装提供Lucida控制台 ,但该字体仅提供有限的字形子集。 我假设你可以在日文Windows电脑的控制台上输出/输入日文文本。 如果你想确定它能在那里工作,你需要检查在日文Windows上有什么可用的。

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

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

您需要正确设置代码页。 这里有一个相当不错的文章: 链接

虽然这是一个非常大的开关,但是你也可以尝试使用另一个控制台,特别是如果你正在做一个roguelike。 libtcod是一个中等流行的库,用C ++语言编写,提供了一个全色控制台,你可以在其中设置自己的字体和字形。这会给你更多的灵活性,而不是被Windows控制台给你。