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

时间:2013-08-22 12:46:45

标签: java unicode

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

例如,我想要一个获得U+00E4并返回ä的函数。

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

是否有内置函数或是否必须对字符串进行一些转换以获取可以发送给函数的整数?

7 个答案:

答案 0 :(得分:23)

代码点写为以U+

为前缀的十六进制数字

所以,你可以这样做

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

答案 1 :(得分:4)

"\u00E4"

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

答案 2 :(得分:3)

从科特林转换而成:

    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();
    }

答案 3 :(得分: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('?')
}

答案 4 :(得分:0)

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

这些增强功能允许使用不同的方法来解决OP中提出的问题。此方法在单个语句中将一组Unicode格式的代码点转换为可读的"ä"

String

这是输出:

void processUnicode() {

    // Create a test string containing "Hello World ?" with code points in Unicode format.
    // Include an invalid code point (+U0wxyz), and a code point outside the Unicode range (+U70FFFF).
    String data = "+U0048+U0065+U006c+U006c+U0wxyz+U006f+U0020+U0057+U70FFFF+U006f+U0072+U006c+U0000064+U20+U1f601";

    String text = Arrays.stream(data.split("\\+U"))
            .filter(s -> ! s.isEmpty()) // First element returned by split() is a zero length string.
            .map(s -> {
                try {
                    return Integer.parseInt(s, 16);
                } catch (NumberFormatException e) { 
                    System.out.println("Ignoring element [" + s + "]: NumberFormatException from parseInt(\"" + s + "\"}");
                }
                return null; // If the code point is not represented as a valid hex String.
            })
            .filter(v -> v != null) // Ignore syntactically invalid code points.
            .filter(i -> Character.isValidCodePoint(i)) // Ignore code points outside of Unicode range.
            .map(i -> Character.toString(i)) // Obtain the string value directly from the code point. (Requires JDK >= 11 )
            .collect(Collectors.joining());

    System.out.println(text); // Prints "Hello World ?"
}

注意:

  • 使用这种方法,不再需要特定功能来转换Unicode格式的代码点。相反,它是通过run: Ignoring element [0wxyz]: NumberFormatException from parseInt("0wxyz"} Hello World ? BUILD SUCCESSFUL (total time: 0 seconds) 处理中的多个中间操作来分散的。当然,仍然可以使用相同的代码来处理Unicode格式的单个代码点。
  • 添加中间操作以在Stream上执行进一步的验证和处理很容易,例如大小写转换,表情符号删除等。

答案 5 :(得分:-4)

你可以打印它们

s='\u0645\u0635\u0631\u064a'
print(s)

答案 6 :(得分:-5)

到目前为止,我发现最简单的方法就是抛出代码点;如果您只是期望每个代码点使用一个字符,那么这对您来说可能没问题。:

int codepoint = ...;
char c = (char)codepoint;