Java Unicode 字符宽度
Java Unicode character widths
我正尝试在 Java 中编写一个将完全显示在控制台中的国际象棋游戏。我为此使用 Unicode 字符,例如 White Chess Queen U+2655。我的问题是我找不到任何与棋子宽度匹配的空白字符,所以我无法正确显示棋盘。看看我下面的输出,我把 pawn 从 h2 移到了 h4:
8 ♜♞♝♛♚♝♞♜
7 ♟♟♟♟♟♟♟♟
6
5
4 ♙
3
2 ♙♙♙♙♙♙♙
1 ♖♘♗♕♔♗♘♖
a b c d e f g h
编辑:通过以下示例更容易指出问题:
♙♙♙♙♙♙♙♙
xxxxxxxx
iiiiiiii
||||||||
你可以看到棋子的宽度比棋子下面的其他字符略大
在这个网站上,棋子的宽度略大于一个标准字符。在我的 Eclipse 控制台中,棋子的宽度略小于 2 个标准字符。
我想我正在请求以下三件事之一:
- 与 Unicode 棋子宽度匹配的空白字符。
- 一个Java方法表示returns一个字符或字符串的宽度
- 一种Java方法,可以将字符或字符串的宽度设置为任意值。
感谢您提供的任何帮助或建议。
编辑:原来是 consolas 字体导致了我的问题。 Consolas,显示的棋子宽度很奇怪,大约1.8个字符宽。我将控制台的字体切换为几种不同的等宽字体,直到找到一种能够正确调整棋子大小的字体。有什么办法可以保证特定的宽度,而不考虑字体?
终端(几乎)总是使用单声道spaced 字体,因此 space 字符与片字符的宽度相同。
你的问题是你在渲染板时在列之间有 spaces,但你没有在你的片段之间插入它们。
public class TextChess {
public static void main(String[] args) {
char[][] board = new char[][] {
{'♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'},
{'♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{'♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'},
{'♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖'}
};
for (int i = 0; i < board.length; i++) {
char[] pieces = board[i];
System.out.print("" + (8 - i) + " ");
for (char piece : pieces) {
System.out.print(piece + " "); // you're missing this space
}
System.out.println();
}
System.out.println(" a b c d e f g h");
}
}
打印:
8 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
6
5
4
3
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
a b c d e f g h
如果您不使用单色spaced 字体,则各部分的宽度会因字体而异。它们 可能 匹配其中一个 unicode space,可能是 en-space (\u2002
) 或 em-space ( \u2003
)。任何解决方案都将特定于您的环境。参考:unicode spaces.
编辑: 我做了一些实验。在大多数字体中(尤其不是我的 Helvetica 版本),国际象棋字形与 em-quad (\u2001
) 的宽度相同。您仍然会 运行 遇到列标签的问题。我注意到封闭的字母数字字形与棋子的宽度基本相同,因此您可以将列标记为 ⒜-⒣
而不是 a-h
(即 \u249C-\u24A3
)。
我正尝试在 Java 中编写一个将完全显示在控制台中的国际象棋游戏。我为此使用 Unicode 字符,例如 White Chess Queen U+2655。我的问题是我找不到任何与棋子宽度匹配的空白字符,所以我无法正确显示棋盘。看看我下面的输出,我把 pawn 从 h2 移到了 h4:
8 ♜♞♝♛♚♝♞♜
7 ♟♟♟♟♟♟♟♟
6
5
4 ♙
3
2 ♙♙♙♙♙♙♙
1 ♖♘♗♕♔♗♘♖
a b c d e f g h
编辑:通过以下示例更容易指出问题:
♙♙♙♙♙♙♙♙
xxxxxxxx
iiiiiiii
||||||||
你可以看到棋子的宽度比棋子下面的其他字符略大
在这个网站上,棋子的宽度略大于一个标准字符。在我的 Eclipse 控制台中,棋子的宽度略小于 2 个标准字符。
我想我正在请求以下三件事之一:
- 与 Unicode 棋子宽度匹配的空白字符。
- 一个Java方法表示returns一个字符或字符串的宽度
- 一种Java方法,可以将字符或字符串的宽度设置为任意值。
感谢您提供的任何帮助或建议。
编辑:原来是 consolas 字体导致了我的问题。 Consolas,显示的棋子宽度很奇怪,大约1.8个字符宽。我将控制台的字体切换为几种不同的等宽字体,直到找到一种能够正确调整棋子大小的字体。有什么办法可以保证特定的宽度,而不考虑字体?
终端(几乎)总是使用单声道spaced 字体,因此 space 字符与片字符的宽度相同。
你的问题是你在渲染板时在列之间有 spaces,但你没有在你的片段之间插入它们。
public class TextChess {
public static void main(String[] args) {
char[][] board = new char[][] {
{'♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'},
{'♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{'♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'},
{'♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖'}
};
for (int i = 0; i < board.length; i++) {
char[] pieces = board[i];
System.out.print("" + (8 - i) + " ");
for (char piece : pieces) {
System.out.print(piece + " "); // you're missing this space
}
System.out.println();
}
System.out.println(" a b c d e f g h");
}
}
打印:
8 ♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
6
5
4
3
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
a b c d e f g h
如果您不使用单色spaced 字体,则各部分的宽度会因字体而异。它们 可能 匹配其中一个 unicode space,可能是 en-space (\u2002
) 或 em-space ( \u2003
)。任何解决方案都将特定于您的环境。参考:unicode spaces.
编辑: 我做了一些实验。在大多数字体中(尤其不是我的 Helvetica 版本),国际象棋字形与 em-quad (\u2001
) 的宽度相同。您仍然会 运行 遇到列标签的问题。我注意到封闭的字母数字字形与棋子的宽度基本相同,因此您可以将列标记为 ⒜-⒣
而不是 a-h
(即 \u249C-\u24A3
)。