字符字面值中字符过多的错误

3

我正在开发一款时尚文本应用程序,但在某些地方遇到了错误(“字符文字中的字符太多”)。我只写了一个字母,但当我粘贴它时,它会转换成许多字母,如"\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;
}

1
它显示为一个“字符”,但在后台它由2个字符组成,这意味着你不能使用char类型来处理它。 - Felix
2个回答

3

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

为了处理这种情况,Java字符串被存储在UTF-16中,它是一种16位编码方式。大多数Unicode字符(称为代码点)都存储在单个16位值中。一些字符则存储在一对16位值中,称为代理对。

这意味着Unicode字符可能会以2个Java中的char“字符”形式存储,这意味着如果您希望您的代码具有完整的Unicode字符支持,则无法将Unicode字符存储在单个char值中。

它们可以存储在一个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) 适用于Java 9及以上版本,Character.toString(codePoint) 适用于Java 11及以上版本。


更新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!" 时的结果:

 !

1

你不能使用 char 数据类型来做什么?你应该解释为什么这是个问题。 - Andy Turner
好的...已添加说明 - Hian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接