gpt4 book ai didi

java - 创建和使用带有代理对的字符串

转载 作者:搜寻专家 更新时间:2023-11-01 02:27:24 26 4
gpt4 key购买 nike

我必须使用高于 0FFFF 的代码点(特别是数学脚本字符)并且没有找到关于如何执行此操作的简单教程。我希望能够 (a) 创建具有高代码点的 String 和 (b) 迭代其中的字符。由于 char 不能保存这些点,我的代码如下所示:

    @Test
public void testSurrogates() throws IOException {
// creating a string
StringBuffer sb = new StringBuffer();
sb.append("a");
sb.appendCodePoint(120030);
sb.append("b");
String s = sb.toString();
System.out.println("s> "+s+" "+s.length());
// iterating over string
int codePointCount = s.codePointCount(0, s.length());
Assert.assertEquals(3, codePointCount);
int charIndex = 0;
for (int i = 0; i < codePointCount; i++) {
int codepoint = s.codePointAt(charIndex);
int charCount = Character.charCount(codepoint);
System.out.println(codepoint+" "+charCount);
charIndex += charCount;
}
}

我觉得这是完全正确的或最简洁的方法。我希望使用诸如 codePointAfter() 之类的方法,但只有 codePointBefore()。请确认这是正确的策略或提供替代策略。

更新:感谢@Jon 的确认。我为此苦苦挣扎 - 这里有两个错误要避免:

  • 代码点没有直接索引(即没有 s.getCodePoint(i)) - 您必须遍历它们
  • 使用 (char) 作为转换会截断 0FFFF 以上的整数,而且不容易发现

最佳答案

在我看来是正确的。如果您想遍历字符串中的代码点,可以将此代码包装在 Iterable 中:

public static Iterable<Integer> getCodePoints(final String text) {
return new Iterable<Integer>() {
@Override public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
private int nextIndex = 0;

@Override public boolean hasNext() {
return nextIndex < text.length();
}

@Override public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
int codePoint = text.codePointAt(nextIndex);
nextIndex += Character.charCount(codePoint);
return codePoint;
}

@Override public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}

当然,您也可以将方法更改为仅返回 int[]:

public static int[] getCodePoints(String text) {
int[] ret = new int[text.codePointCount(0, text.length())];
int charIndex = 0;
for (int i = 0; i < ret.length; i++) {
ret[i] = text.codePointAt(charIndex);
charIndex += Character.charCount(ret[i]);
}
return ret;
}

我同意遗憾的是 Java 库还没有公开这样的方法,但至少它们不难写。

关于java - 创建和使用带有代理对的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18556695/

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