從代碼點十六進位字串建立 Unicode 字符
1. 概述
Java 對 Unicode 的支援使得使用不同語言和腳本的字元變得簡單
在本教程中,我們將探索並學習如何從 Java 中的程式碼點取得 Unicode 字元。
2.問題介紹
Java 的 Unicode 支援使我們能夠快速建立國際化的應用程式。讓我們來看幾個例子:
static final String U_CHECK = "✅"; // U+2705
static final String U_STRONG = "强"; // U+5F3A
在上面的範例中,複選標記「✅」和「強」(中文「強」)都是 Unicode 字元。
我們知道,如果我們的字串遵循轉義「u」和十六進位數字的模式,則可以在 Java 中正確表示 Unicode 字符,例如:
String check = "\u2705";
assertEquals(U_CHECK, check);
String strong = "\u5F3A";
assertEquals(U_STRONG, strong);
在某些場景下,我們會得到「\u」後面的十六進位數字,需要取得對應的Unicode字元。例如,當我們收到字串格式的數字「 2705″
時,應該會產生複選標記「✅」。
我們可能想到的第一個想法是將「\\u」和數字連接起來。然而,這並不能完成任務:
String check = "\\u" + "2705";
assertEquals("\\u2705", check);
String strong = "\\u" + "5F3A";
assertEquals("\\u5F3A", strong);
如測試所示,連接“\\u”和數字(例如“2705”)會產生文字字串“ \\u2705
”,而不是複選標記“✅”。
接下來,我們來探討如何將給定的數字轉換為 Unicode 字串。
3.理解「 \u
」後面的十六進制數
Unicode 為每個字元分配一個唯一的代碼點,提供了跨不同語言和腳本表示文字的通用方法。代碼點是 Unicode 標準中唯一標識字元的數值。
要在 Java 中建立 Unicode 字符,我們需要了解所需字符的代碼點。一旦我們有了程式碼點,我們就可以使用 Java 的char
資料類型和轉義序列「\u」來表示 Unicode 字元。
在“\ uxxxx
”表示法中, “xxxx”是字元的十六進位表示的代碼點。例如,「 A
」的十六進位 ASCII 代碼為 41(十進位:65)。因此,如果我們使用 Unicode 符號“\u0041”
我們可以得到字串“ A
”:
assertEquals("A", "\u0041");
那麼接下來我們來看看如何從「\u」後面的十六進位數中取得想要的Unicode字元。
4. 使用Character.toChars()
方法
現在我們明白「\u」後面的十六進制數代表什麼了。當我們收到“2705”時,它是字元代碼點的十六進位表示形式。
如果我們得到程式碼點整數, Character.toChars(int codePoint)
方法可以提供我們一個保存程式碼點的 Unicode 表示形式的 char 陣列。最後,我們可以呼叫String.valueOf()
來取得目標字串:
Given "2705"
|_ Hex(codePoint) = 0x2705
|_ codePoint = 9989 (decimal)
|_ char[] chars = Character.toChars(9989)
|_ String.valueOf(chars)
|_"✅"
正如我們所看到的,要獲得目標字符,我們必須先找到程式碼點。
程式碼點整數可以透過使用Integer.parseInt()
方法解析十六進位(以 16 為基數)基數提供的字串來取得。
接下來,讓我們將所有內容放在一起:
int codePoint = Integer.parseInt("2705", 16); // Decimal int: 9989
char[] checkChar = Character.toChars(codePoint);
String check = String.valueOf(checkChar);
assertEquals(U_CHECK, check);
codePoint = Integer.parseInt("5F3A", 16); // Decimal int: 24378
char[] strongChar = Character.toChars(codePoint);
String strong = String.valueOf(strongChar);
assertEquals(U_STRONG, strong);
值得注意的是,如果我們使用Java 11或更高版本,我們可以使用Character.toString()
方法直接從程式碼點整數取得字串,例如:
// For Java 11 and later versions:
assertEquals(U_STRONG, Character.toString(codePoint));
當然,我們可以將上面的實作封裝在一個方法中:
String stringFromCodePointHex(String codePointHex) {
int codePoint = Integer.parseInt(codePointHex, 16);
// For Java 11 and later versions: return Character.toString(codePoint)
char[] chars = Character.toChars(codePoint);
return String.valueOf(chars);
}
最後,讓我們測試該方法以確保它產生預期的結果:
assertEquals("A", stringFromCodePointHex("0041"));
assertEquals(U_CHECK, stringFromCodePointHex("2705"));
assertEquals(U_STRONG, stringFromCodePointHex("5F3A"));
5. 結論
在本文中,我們首先了解了“\uxxxx”
表示法中“xxxx”
的含義,然後探討如何從給定代碼點的十六進位表示法取得目標 Unicode 字串。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。