如何将 Unicode 字符放入 Java 字符串中?

问题描述

如何将 Unicode char U+1F604 放入 Java String? 我尝试使用

String s = "\u1F604";

但它相当于

String s = "\u1F60"+"4";

它被分成了 2 个字符。

解决方法

DuncG 的回答是一个很好的方法。对此的简短解释是 Unicode 字符,默认情况下,只占用 4 个字节,因此字符串文字转义只允许 \u####。但是,表情符号是 surrogate pairs,Unicode 为这些对保留了 U+D800U+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);
	}
}

Try it online!

,

第三个变体,尤其是 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},1) + "!"; // < 11
    System.out.println(s1 + " " + s2);
  }
}

(请注意,在某些其他语言中可能会使用 \U0001f604。在 Java 中,\u\U 是相同的。)

,

字符 U+1F604 的 UTF-16 编码是 0xD83D 0xDE04,所以应该是:

String s = "\uD83D\uDE04";
,

您可以将此 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);

输出:

? ? ?