如何将 Unicode 字符放入 Java 字符串中? [复制]

Posted

技术标签:

【中文标题】如何将 Unicode 字符放入 Java 字符串中? [复制]【英文标题】:How to put Unicode char in Java String? [duplicate] 【发布时间】:2021-09-16 08:46:18 【问题描述】:

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

String s = "\u1F604";

但它相当于

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

它被分成 2 个字符。

【问题讨论】:

有几个关于 SO 的现有问题可以解决您的问题。除了链接的副本之外,Manually converting unicode codepoints into UTF-8 and UTF-16 问题的一些答案提供了对 UTF-8 和 UTF-16 编码如何工作的非常有用的解释。 【参考方案1】:

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!

【讨论】:

【参考方案2】:

第三个变种,尤其是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是相同的。)

【讨论】:

【参考方案3】:

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

String s = "\uD83D\uDE04";

【讨论】:

这不是一个好的答案,原因如下: [1] 您没有解释或展示如何从代码点确定 UTF-16 编码。您刚刚将其作为既成事实 提出。 [2] 这不是一个通用的解决方案。您仅对特定代码点的解决方案进行了硬编码。 [3] 自 Java 11 以来,有一种更好、更简单的方法,如 Joop Eggen 的答案所示,可以轻松调整它以适用于任何平面中的任何代码点。【参考方案4】:

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

输出:

? ? ? ?

【讨论】:

【参考方案5】:

如果你有一个字符的十六进制值的字符串表示,你可以使用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 字符放入 Java 字符串中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将单片机中字符串转unicode码

将 Unicode 字符插入 JavaScript

如何检测 Java 字符串中的 unicode 字符?

如何替换 Java 中不可打印的 Unicode 字符?

SAP中如何将一个字符串转成UNICODE格式传送?

如何将拉丁 unicode 字符替换为 [a-z] 字符