Java 如何将unicode代码点转换为其字符表示形式?

Java 如何将unicode代码点转换为其字符表示形式?,java,unicode,Java,Unicode,如何将表示代码点的字符串转换为适当的字符 例如,我想要一个函数,它获取U+00E4并返回a 我知道在character类中有一个函数toChars(int codePoint),它接受一个整数,但没有一个函数接受这种类型的字符串 是否有内置函数,或者我必须对字符串进行一些转换才能得到可以发送到函数的整数?代码点以十六进制数字形式写入,前缀为U+ 所以,你可以这样做 int codepoint=Integer.parseInt(yourString.substring(2),16); char[]

如何将表示代码点的字符串转换为适当的字符

例如,我想要一个函数,它获取
U+00E4
并返回
a

我知道在character类中有一个函数
toChars(int codePoint)
,它接受一个整数,但没有一个函数接受这种类型的字符串


是否有内置函数,或者我必须对字符串进行一些转换才能得到可以发送到函数的整数?

代码点以十六进制数字形式写入,前缀为U+

所以,你可以这样做

int codepoint=Integer.parseInt(yourString.substring(2),16);
char[] ch=Character.toChars(codepoint);
调用
String

"\u00E4"

new String(new int[] { 0x00E4 }, 0, 1);

此示例不使用char[]

// this code is Kotlin, but you can write same thing in Java
val sb = StringBuilder()
val cp :Int // codepoint
when {
    Character.isBmpCodePoint(cp) -> sb.append(cp.toChar())
    Character.isValidCodePoint(cp) -> {
        sb.append(Character.highSurrogate(cp))
        sb.append(Character.lowSurrogate(cp))
    }
    else -> sb.append('?')
}

到目前为止,我找到的最简单的方法就是直接抛出代码点;如果您只是希望每个代码点有一个字符,那么这对您来说可能很好

int codepoint = ...;
char c = (char)codepoint;
你可以把它们打印出来

s='\u0645\u0635\u0631\u064a'
print(s)
从Kotlin转换而来:

    public String codepointToString(int cp) {
        StringBuilder sb = new StringBuilder();
        if (Character.isBmpCodePoint(cp)) {
            sb.append((char) cp);
        } else if (Character.isValidCodePoint(cp)) {
            sb.append(Character.highSurrogate(cp));
            sb.append(Character.lowSurrogate(cp));
        } else {
            sb.append('?');
        }
        return sb.toString();
    }

问题要求函数转换表示Unicode代码点的字符串值(即
“+unnn”
,而不是
“\unnn”
“0xnnnn
)的Java格式)。但是,较新版本的Java具有一些增强功能,可以简化对包含Unicode格式的多个代码点的字符串的处理:

  • Java8中流的介绍
  • 方法,该方法被添加到Java 11中的
    Character
    类中。它返回
    字符串而不是
    char[]
    ,因此
    Character.toString(0x00E4)
    返回
    “ä”
这些增强功能允许采用不同的方法来解决OP中提出的问题。此方法将Unicode格式的一组代码点转换为单个语句中可读的
字符串

void processUnicode(){

//创建一个测试字符串,其中包含“Hello World,您正在将其视为int-literal..op,将其作为字符串,格式为
U+00E4
@Anirudh,对了,您对其进行了适当的处理。但我想知道
“\u00e4”
是否已知是等效的(即在java源代码中)。你从我这里得到了+1。我想它们是等效的。但我不确定这是目前为止我看到的最简单的一个。你能得到一个Java字符而不是一个字符数组吗?@k-den是的,带有类似于
new StringBuilder().appendCodePoint(codepoint).toString().charAt(0)的内容
,但请注意,64k以上的代码点将导致两个字符,一个高代理项对和一个低代理项对。您可能更愿意省略
.charAt(0)
并简单地将结果作为
字符串获得。如果代码点高于char的最大值,那么它将溢出,并且您将获得错误的代码点。我认为这不是一个好主意。
char
类型在Java中已经过时很多年(几十年?),甚至无法表示Unicode中定义的一半字符。这太令人沮丧了。您已经给出了有关Unicode处理的最完整的答案,但是用错误的语言回答有什么意义?具体来说,Java中的cp.toChar()等价物是什么?您可以使用
stringBuilder.appendCodePoint(cp)
而不是这个。我知道。我准备了这个代码来解释这个机制。谢谢,但它实际上是@tateisu的代码通过转换器运行的