一旦我设法在控制台上打印棋子;这里涉及到几个复杂性。
首先,您必须在标准输出上启用 UTF-16 模式;这在这里和这里都有描述,这与 Mehrdad 解释的完全一样。
#include <io.h>
#include <fcntl.h>
...
_setmode(_fileno(stdout), _O_U16TEXT);
然后,即使输出正确到达控制台,在控制台上你可能会得到垃圾而不是预期的字符;这是因为,至少在我的机器(Windows 7)上,默认的控制台字体不支持棋子字形。
要解决此问题,您必须选择支持它们的不同 TrueType 字体,但要使这样的字体可用,您必须经历一些麻烦;就个人而言,我发现 DejaVu Sans Mono 工作得很好。
因此,此时,您的代码应该可以工作,并且代码如下(我过去编写的用于测试此问题的示例):
#include <wchar.h>
#include <stdio.h>
#include <locale.h>
#ifdef _WIN32
#include <io.h>
#include <fcntl.h>
#endif
enum ChessPiecesT
{
King,
Queen,
Rock,
Bishop,
Knight,
Pawn,
};
enum PlayerT
{
White=0x2654, /* white king */
Black=0x265a, /* black king */
};
/* Provides the character for the piece */
wchar_t PieceChar(enum PlayerT Player, enum ChessPiecesT Piece)
{
return (wchar_t)(Player + Piece);
}
/* First row of the chessboard (black) */
enum ChessPiecesT TopRow[]={Rock, Knight, Bishop, Queen, King, Bishop, Knight, Rock};
void PrintTopRow(enum PlayerT Player)
{
int i;
for(i=0; i<8; i++)
putwchar(PieceChar(Player, TopRow[Player==Black?i: (7-i)]));
putwchar(L'\n');
}
/* Prints the eight pawns */
void PrintPawns(enum PlayerT Player)
{
wchar_t pawnChar=PieceChar(Player, Pawn);
int i;
for(i=0; i<8; i++)
putwchar(pawnChar);
putwchar(L'\n');
}
int main()
{
#ifdef _WIN32
_setmode(_fileno(stdout), _O_U16TEXT);
#else
setlocale(LC_CTYPE, "");
#endif
PrintTopRow(Black);
PrintPawns(Black);
fputws(L"\n\n\n\n", stdout);
PrintPawns(White);
PrintTopRow(White);
return 0;
}
在 Windows 和 Linux 上应该同样适用。
现在你仍然有一个问题:字形太小而没有任何意义:
这只能通过扩大控制台字体来解决,但是你会让所有其他字符太大而无法使用。因此,总而言之,最好的解决办法可能就是编写一个 GUI 应用程序。