簡體   English   中英

Java Unicode字符寬度

[英]Java Unicode character widths

我試圖用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個字符。 我將控制台的字體切換為幾種不同的等寬字體,直到找到一種可以正確調整棋子大小的字體。 有什么方法可以確保特定的寬度,而不管字體是什么?

終端(幾乎)始終使用等寬字體,因此空格字符與分段字符的寬度相同。

您的問題是您要渲染的板在各列之間留有間隔,但沒有在零件之間插入它們。

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空間( \  )或em空間( \  )。 任何解決方案都將特定於您的環境。 參考: unicode空格

編輯:我做了一些實驗。 在大多數字體中(尤其不是我的Helvetica tho'版本),國際象棋字形的寬度與em-quad相同( \  )。 您仍然會遇到列標簽問題。 我注意到,封閉的字母數字標志符號也與國際象棋棋子的寬度大致相同,因此您可以將列⒜-⒣而不是ah標記為(即\⒜-\⒣ )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM