有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java字符文字错误中的字符太多

我正在创建一个时尚的文本应用程序,但在某些地方我遇到了一个错误(“字符文字中的字符太多”)。我只写了一个字母,但当我粘贴它时,它会转换成许多这样的字母:“\uD83C\uDD89”,而原来的字母是”🆉“

请告诉我如何用正确的方式写这个

for (int charOne = 0; charOne <= strBld.length() - 1; charOne++) {
                    char a = strBld.charAt(charOne);
                    char newCh = getSpecialCharEighth(a);
                    strBld.setCharAt(charOne, newCh);

                }

private char getSpecialCharEighth(char a) {
        char ch = a;

    if (ch == 'Z' || ch == 'z') {
    ch = '\uD83C\uDD89';
    }

  return ch;
}

共 (2) 个答案

  1. # 2 楼答案

    Java char存储一个16位的值,即可以存储65536个不同的值。目前Unicode(12.1)中有137929个字符

    为了处理这个问题,Java字符串存储在UTF-16中,UTF-16是一种16位编码。大多数Unicode字符(称为代码点)存储在单个16位值中。有些存储在一对16位值中,称为代理项对

    这意味着在Java中,Unicode字符可以存储为2 char“字符”,这意味着如果希望代码具有完全的Unicode字符支持,就不能在单个char值中存储Unicode字符

    它们可以存储在int变量中,在Java中,该值被称为代码点。然而,通常更容易将它们存储为String

    在您的情况下,您似乎正在替换Unicode字符,因此正则表达式替换调用可能更好,例如

    s = s.replaceAll("[Zz]", "\uD83C\uDD89");
    
    // Or like this if source file is UTF-8
    s = s.replaceAll("[Zz]", "🆉");
    

    更新

    如果要保留确定重置价值的方法,可以执行以下操作:

    s = Pattern.compile(".").matcher(s).replaceAll​(mr -> getSpecialCharEighth(mr.group()));
    
    private static String getSpecialCharEighth(String s) {
        int cp = s.codePointAt(0);
        if (cp >= 'A' && cp <= 'Z')
            return Character.toString​(cp - 'A' + 0x1f170); // "🅰" - "🆉"
        if (cp >= 'a' && cp <= 'z')
            return Character.toString​(cp - 'a' + 0x1f170); // "🅰" - "🆉"
        return s;
    }
    

    注意:replaceAll​(replacer)是Java9+,Character.toString(codePoint)是Java11+


    更新2

    由于问题被标记为android,所以Java 9和Java 11 API不可用,所以这里是Java 7+解决方案

    StringBuffer buf = new StringBuffer(s.length() + 16);
    Matcher m = Pattern.compile(".").matcher(s);
    while (m.find())
        m.appendReplacement(buf, getSpecialCharEighth(m.group()));
    s = m.appendTail(buf).toString();
    
    private static String getSpecialCharEighth(String s) {
        int cp = s.codePointAt(0);
        if (cp >= 'A' && cp <= 'Z')
            return new String(new int[] { cp - 'A' + 0x1f170 }, 0, 1);
        if (cp >= 'a' && cp <= 'z')
            return new String(new int[] { cp - 'a' + 0x1f170 }, 0, 1);
        return s;
    }
    

    结果为s = "Hello World!"

    🅷🅴🅻🅻🅾 🆆🅾🆁🅻🅳!