如何将 Unicode 字符放入 Java 字符串中?
How to put Unicode char in Java String?
如何将 Unicode 字符 U+1F604 放入 Java 字符串中?
我尝试使用
String s = "\u1F604";
但它相当于
String s = "\u1F60"+"4";
它被分成了 2 个字符。
你的字符 U+1F604
的 UTF-16 编码是 0xD83D 0xDE04
,所以它应该是:
String s = "\uD83D\uDE04";
DuncG 的回答是一个很好的方法。对此的简短解释是,默认情况下,Unicode 字符只占用 4 个字节,因此字符串文字转义只允许 \u####
。但是,表情符号是 surrogate pairs,Unicode 已为这些对保留 U+D800
到 U+DFFF
,允许 1024 x 1024 对字符。
另一种不需要转换为 UTF-16 和编码为代理对的方法是使用 Character.toChars(...)
:
public class Main {
public static void main(String[] args) {
String s = "Hello " + new String(Character.toChars(0x1f604)) + "!";
System.out.println(s);
}
}
第三种变体,特别是Character.toString(0x1f604)
:
public class Main {
public static void main(String[] args) {
String s1 = "Hello " + Character.toString(0x1f604) + "!"; // Since Java 11
String s2 = "Hello " + new String(new int[]{0x1f604}, 0, 1) + "!"; // < 11
System.out.println(s1 + " " + s2);
}
}
(请注意,在某些 其他 语言中,可能会使用 \U0001f604
。在 java 中,\u
和 \U
是一样。)
您可以将此 UTF-16 smiley face 符号添加到字符串中作为 符号 本身,作为十六进制或十进制 代理项对,或其补充 代码点。
// symbol itself
String str1 = "";
// surrogate pair
String str2 = "\uD83D\uDE04";
// surrogate pair to its supplementary code point value
int cp = Character.toCodePoint('\uD83D', (char) 0xDE04);
// since 11 - decimal codepoint to string
String str3 = Character.toString(cp);
// since 11 - hexadecimal codepoint to string
String str4 = Character.toString(0x1f604);
// output
System.out.println(str1 + " " + str2 + " " + str3 + " " + str4);
输出:
如果您有字符的 十六进制 值的字符串表示,您可以使用 Integer.parseInt
方法读取数值。
// surrogate pair
char high = (char) Integer.parseInt("D83D", 16);
char low = (char) Integer.parseInt("DE04", 16);
String str1 = new String(new char[]{high, low});
// supplementary code point
int cp = Integer.parseInt("1F604", 16);
char[] chars = Character.toChars(cp);
String str2 = new String(chars);
// since 11
String str3 = Character.toString(cp);
// output
System.out.println(str1 + " " + str2 + " " + str3);
输出:
如何将 Unicode 字符 U+1F604 放入 Java 字符串中? 我尝试使用
String s = "\u1F604";
但它相当于
String s = "\u1F60"+"4";
它被分成了 2 个字符。
你的字符 U+1F604
的 UTF-16 编码是 0xD83D 0xDE04
,所以它应该是:
String s = "\uD83D\uDE04";
DuncG 的回答是一个很好的方法。对此的简短解释是,默认情况下,Unicode 字符只占用 4 个字节,因此字符串文字转义只允许 \u####
。但是,表情符号是 surrogate pairs,Unicode 已为这些对保留 U+D800
到 U+DFFF
,允许 1024 x 1024 对字符。
另一种不需要转换为 UTF-16 和编码为代理对的方法是使用 Character.toChars(...)
:
public class Main {
public static void main(String[] args) {
String s = "Hello " + new String(Character.toChars(0x1f604)) + "!";
System.out.println(s);
}
}
第三种变体,特别是Character.toString(0x1f604)
:
public class Main {
public static void main(String[] args) {
String s1 = "Hello " + Character.toString(0x1f604) + "!"; // Since Java 11
String s2 = "Hello " + new String(new int[]{0x1f604}, 0, 1) + "!"; // < 11
System.out.println(s1 + " " + s2);
}
}
(请注意,在某些 其他 语言中,可能会使用 \U0001f604
。在 java 中,\u
和 \U
是一样。)
您可以将此 UTF-16 smiley face 符号添加到字符串中作为 符号 本身,作为十六进制或十进制 代理项对,或其补充 代码点。
// symbol itself
String str1 = "";
// surrogate pair
String str2 = "\uD83D\uDE04";
// surrogate pair to its supplementary code point value
int cp = Character.toCodePoint('\uD83D', (char) 0xDE04);
// since 11 - decimal codepoint to string
String str3 = Character.toString(cp);
// since 11 - hexadecimal codepoint to string
String str4 = Character.toString(0x1f604);
// output
System.out.println(str1 + " " + str2 + " " + str3 + " " + str4);
输出:
如果您有字符的 十六进制 值的字符串表示,您可以使用 Integer.parseInt
方法读取数值。
// surrogate pair
char high = (char) Integer.parseInt("D83D", 16);
char low = (char) Integer.parseInt("DE04", 16);
String str1 = new String(new char[]{high, low});
// supplementary code point
int cp = Integer.parseInt("1F604", 16);
char[] chars = Character.toChars(cp);
String str2 = new String(chars);
// since 11
String str3 = Character.toString(cp);
// output
System.out.println(str1 + " " + str2 + " " + str3);
输出: