Java Unicode字符宽度

时间:2017-11-28 17:57:28

标签: java unicode character chess

我正在尝试用Java编写一个完全在控制台中显示的国际象棋游戏。我正在使用Unicode字符,例如White Chess Queen U + 2655。我的问题是我找不到任何与棋子宽度相匹配的空白字符,所以我无法正确显示电路板。看看下面的输出,我把棋子从h2移到了h4:

8 ♜♞♝♛♚♝♞♜
7 ♟♟♟♟♟♟♟♟
6                 
5                 
4               ♙
3                 
2 ♙♙♙♙♙♙♙  
1 ♖♘♗♕♔♗♘♖
  a b c d e f g h 

编辑:使用以下示例更容易指出问题:

♙♙♙♙♙♙♙♙
xxxxxxxx
iiiiiiii
||||||||

你可以看到棋子的宽度略大于棋子下面的其他角色。

在这个网站上,国际象棋棋子的宽度略大于标准角色的宽度。在我的Eclipse控制台中,棋子的宽度略小于2个标准字符。

我想我要求三件事之一:

  • 与Unicode棋子宽度相匹配的空格字符。
  • 返回字符或字符串宽度的Java方法
  • 一种Java方法,可以将字符或字符串的宽度设置为任意值。

感谢您提供的任何帮助或建议。

编辑:结果是导致我出现问题的consolas字体。 Consolas,展示宽度非常奇怪的棋子,宽约1.8个字符。我将控制台的字体切换为几种不同的等宽字体,直到找到一个正确尺寸的棋子。有没有办法确保特定的宽度,无论字体是什么?

1 个答案:

答案 0 :(得分:2)

终端(几乎)总是使用等宽字体,因此空格字符与片段字符的宽度相同。

您的问题是,您要在列之间使用空格渲染电路板,但是您不会在它们之间插入它们。

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  

如果您不使用等宽字体,则各个部分的宽度会因字体而异。它们可能匹配其中一个unicode空间,可能是en-space(\u2002)或em-space(\u2003)。任何解决方案都将特定于您的环境。参考:unicode spaces

编辑:我做了一些实验。在大多数字体中(特别是我的Helvetica tho&#39;),象形文字的宽度与em-quad(\u2001)的宽度相同。您仍会遇到列标签问题。我注意到封闭的字母数字字形大多与棋子的宽度相同,因此您可以标记列⒜-⒣而不是a-h(即\u249C-\u24A3)。