gpt4 book ai didi

java - 字 rune 字错误中的字符太多

转载 作者:行者123 更新时间:2023-12-04 11:39:54 29 4
gpt4 key购买 nike

我正在创建一个时尚的文本应用程序,但在某些地方出现错误(“字 rune 字中的字符太多”)。我只写了一个字母,但是当我粘贴它时,它会转换成许多这样的字母:“\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;
}

最佳答案

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

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

这意味着一个Unicode字符在Java中可能存储为2个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]", "🆉");

更新

如果您想保留确定重置值(value)的方法,您可以这样做:

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!"

🅷🅴🅻🅻🅾 🆆🅾🆁🅻🅳!

关于java - 字 rune 字错误中的字符太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59737816/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com