如何在Java中正确打印扑克牌Unicode字符?
如何在Java中正确打印扑克牌Unicode字符?
嘿,我来帮你搞定这个扑克牌Unicode字符打印乱码的问题!你遇到的问号或者奇怪的乱码,主要是三个原因:你用的是私人使用区(PUA)的非标准Unicode字符、控制台字体不支持这些字符,还有控制台编码和Java输出编码不匹配。咱们一步步来解决:
1. 先换用标准的扑克牌Unicode字符
你代码里用的\uF0A1这类字符属于Unicode的私人使用区,这些字符没有被官方标准化,只有特定的字体才会包含它们,兼容性特别差。其实Unicode早就有官方定义的扑克牌字符,范围是U+1F0A0到U+1F0FF,比如黑桃A是U+1F0A1,红桃2是U+1F0B2,这些字符在现代字体(比如Segoe UI Symbol、Noto Sans Symbols)里都能正常显示。
不过要注意:这些字符属于Unicode补充平面,单个char(Java里是16位)存不下,得用String来存储。所以你需要修改Card类的属性:
import java.util.ArrayList; import java.util.Collections; public class Card { // 把char改成String,支持补充平面Unicode字符 protected String unicodeCard; protected int value; public Card() {} public Card(String unicodeCard, int value) { this.unicodeCard = unicodeCard; this.value = value; } public ArrayList<Card> buildDeck() { ArrayList<Card> deck = new ArrayList<>(); // 用标准Unicode扑克牌字符,注意是字符串形式 deck.add(new Card("\uD83C\uDCA1", 11)); // 黑桃A deck.add(new Card("\uD83C\uDCB1", 11)); // 红桃A deck.add(new Card("\uD83C\uDCC1", 11)); // 方块A deck.add(new Card("\uD83C\uDCD1", 11)); // 梅花A deck.add(new Card("\uD83C\uDCA2", 2)); // 黑桃2 deck.add(new Card("\uD83C\uDCB2", 2)); // 红桃2 // 剩下的牌可以按这个规律替换,比如黑桃3是\uD83C\uDCA3,以此类推 // ... 这里省略其他牌的代码,你可以自己补全 return deck; } public void shuffle(ArrayList<Card> deck) { Collections.shuffle(deck); } public String getCardString() { return this.unicodeCard; } }
2. 调整控制台的编码和字体
即使代码改对了,控制台本身的设置不对也会乱码:
- Windows CMD/PowerShell:先打开控制台,输入命令
chcp 65001把编码改成UTF-8。然后右键控制台标题栏→属性→字体,选择支持Unicode的字体(比如Segoe UI Symbol)。 - Linux/macOS终端:默认编码一般是UTF-8,只需要确认终端字体包含扑克牌字符就行,比如用Noto Sans系列字体。
3. 修改主方法的打印逻辑
现在用String来存储字符,打印的时候直接输出字符串就行,不用再折腾PrintStream的编码(当然保持UTF-8也没问题):
import java.io.UnsupportedEncodingException; import java.io.PrintStream; public class Main { public static void main(String[] args) throws UnsupportedEncodingException { // 保持UTF-8输出,或者直接用System.out也可以(只要控制台编码是UTF-8) PrintStream out = new PrintStream(System.out, true, "UTF-8"); Card card = new Card(); ArrayList<Card> deck = card.buildDeck(); for (Card c : deck) { out.println(c.getCardString()); } } }
为什么原来的方法不行?
你之前用的\uF0A1这类字符是某些字体厂商私有的,不是官方Unicode标准,只有安装了对应字体(比如某些图标字体)才能显示,而且控制台默认字体根本不包含这些字符,所以只能显示问号或者乱码。换成官方标准的扑克牌字符后,兼容性会好很多。
备注:内容来源于stack exchange,提问作者Ant753
相关产品推荐
相关产品推荐

