在 Windows 终端中输出 unicode 字符
Posted
技术标签:
【中文标题】在 Windows 终端中输出 unicode 字符【英文标题】:Outputting unicode characters in windows terminal 【发布时间】:2010-12-16 01:31:57 【问题描述】:在过去的一周里,我和一个朋友一起用 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 字符?
编辑:
好的,所以我发现我的编码工作正常。问题是 我需要强制终端切换到更丰富的 unicode 字体。有没有跨平台的方法来做到这一点?是否有特定于 Windows 的方法来执行此操作?
【问题讨论】:
您是否阅读过 Spolsky 的“每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有任何借口!)”?如果您使用字符集,显然您应该在下一次呼吸之前阅读:joelonsoftware.com/articles/Unicode.html 我对字符集有一些经验,但没有阅读过那篇文章。我会检查一下,谢谢你的提示:) 【参考方案1】:虽然这是一个相当大的开关,但您可以尝试使用其他控制台,尤其是在您玩 roguelike 游戏时。 libtcod 是一个比较流行的库,用 C 语言编写,带有 C++ 绑定,它提供了一个全彩色控制台,您可以在其中设置自己的字体和字形。这应该比拘泥于 Windows 控制台提供更多的灵活性给你。
【讨论】:
【参考方案2】:问题是我需要强制终端切换到更丰富的 unicode 字体。有没有跨平台的方法来做到这一点?是否有特定于 Windows 的方法来执行此操作?
我查看了这个,但找不到执行此操作的 Windows API 调用(当然,这可能只是意味着我没有找到它)。我不希望找到一种跨平台的方式来做到这一点。
我能想到的最佳解决方案是使用特殊构造的Shell Link (.LNK) 文件启动控制台。如果您阅读file format documentation,您会发现它允许您指定字体。
但您的问题还不止于此。 Windows 的西方语言环境安装提供Lucida Console,但该字体仅提供有限的字形子集。我假设您可以在日文 Windows PC 上的控制台中输出/输入日文文本。如果您想确保它可以在那里工作,您需要检查日语 Windows 上可用的内容。
Linux(至少是 Ubuntu)在这里似乎有更好的支持,使用 UTF-8 并提供具有广泛字素支持的字体。我没有检查其他发行版以了解其中的故事,也没有检查终端中字体是如何解析的(无论是 X 的东西、Gnome 的东西还是其他)。
【讨论】:
我还没有尝试创建 Shell 链接,因为我们必须解决一些错误。但是这个回复很好地回答了我的问题。谢谢:)【参考方案3】:您需要正确设置代码页。这里有一篇很好的文章:link
【讨论】:
我不喜欢使用特定于平台的方法,但我尝试使用SetConsoleCP(65001);
来获取 UTF-8... 不起作用。【参考方案4】:
原则上,控制台支持所有 unicode 字符。您看到问号的事实可能与这些字符的字体支持有关。尝试将控制台字体切换为具有非常好的 unicode 支持的字体。
【讨论】:
我是否必须依赖用户来执行此操作?或者我可以强制更改应用程序内的字体吗? +1,这确实是场景,尽管该解决方案仅适用于开发机器:/以上是关于在 Windows 终端中输出 unicode 字符的主要内容,如果未能解决你的问题,请参考以下文章
如何在忽略不可编码字符的同时输出Python3(unicode)字符串
在 Windows 中使用 C++ 将 Unicode 输出到控制台
为啥脚本语言不将 Unicode 输出到 Windows 控制台?