java从unicode代码点获取unicode表示字符串

问题描述

我想从整数代码获取 java 使用的字符串表示形式 \u。我找遍了整个地方,但还没有找到 \ud83e\udd82 的工作 awnswer ,它是 ? 。我通过从字节码查看器编译和反编译 jar 得到了符号。我不知道它是如何获取这些字符串的或从哪里获取的。在 java 中开发复制 unicode 字符然后粘贴它并获取它的 java 字符串版本时非常有用。所以不必每个类都使用它的 utf-8 格式。

解决方法

? (SCORPION) 是 Unicode 代码点 1f982,即 UTF-16 d83e dd82 和 UTF-8 f0 9f a6 82

要将代码点整数转换为 Unicode 转义的 Java 字符串,请运行以下代码:

// Java 11+
int codePoint = 0x1f982;
char[] charArray = Character.toString(codePoint).toCharArray();
System.out.printf("\\u%04x\\u%04x",(int) charArray[0],(int) charArray[1]);
// prints: \ud83e\udd82
// Java 1.5+
int codePoint = 0x1f982;
char[] charArray = new String(new int[] { codePoint },1).toCharArray();
System.out.printf("\\u%04x\\u%04x",(int) charArray[1]);
// prints: \ud83e\udd82
,

这里可以将字符串中的unicode字符直接转换为java的格式。

    /**
     * return the java unicode string from the utf-8 string
     * TODO: add an option to change the unicode number strings to not just the codepoints
     */
    public static String toUnicodeEsq(String unicode)
    {
        StringBuilder b = new StringBuilder();
        int[] arr = unicode.codePoints().toArray();
        for(int i : arr)
            b.append(toUnicodeEsq(i));
        return b.toString();
    }
    
    public static String toUnicodeEsq(int cp)
    {
        return isAscii(cp) ? "" + (char) cp : Character.isBmpCodePoint(cp) ? "\\u" + String.format("%04x",cp) : "\\u" + String.format("%04x",(int)Character.highSurrogate(cp)) + "\\u" + String.format("%04x",(int)Character.lowSurrogate(cp) );
    }

    public static boolean isAscii(int cp) 
    {
        return cp <= Byte.MAX_VALUE;
    }

我的方法不直接支持 Unicode 数字 (U+hex),但是,您可以从 css、html 和 unicode 数字格式中一次一个地获取字符串

    /**
     * get the codepoint from the unicode number. from there you can convert it to a unicode escape sequence using {@link JavaUtil#getUnicodeEsq(int)}
     * "U+hex" for unicode number
     * "&#codePoint;" or "&#hex;" for html
     * "\hex" for css
     * "hex" for lazyness
     */
    public static int parseUnicodeNumber(String num)
    {
        num = num.toLowerCase();
        if(num.startsWith("u+"))
            num = num.substring(2);
        else if(num.startsWith("&#"))
            return num.startsWith("&#x") ? Integer.parseInt(num.substring(3,num.length() - 1),16) : Integer.parseInt(num.substring(2,num.length() - 1)); 
        else if(num.startsWith("\\"))
            num = num.substring(1);
        return Integer.parseInt(num,16);
    }
    
    /**
     * convert a unicode number directly to unicode escape sequence in java
     */
    public static String unicodeNumberToEsq(String num)
    {
        return toUnicodeEsq(parseUnicodeNumber(num));
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...