Java String.codePointBefore()什么时候有用?

Java String.codePointBefore()什么时候有用?,java,unicode,Java,Unicode,是否有任何使用案例表明使用codePointBefore()会有好处?如果你有索引,你已经可以codepoint(i-1) 一个代码点可能由多个仍然存在的字符组成。在其基础数组的索引中指定给方法的索引char[]value不是代码点的索引。这些检查边界和换行方法包括: 差异很重要,因为索引-1并不总是前一个代码点的起点;因此codePointBefore()需要从index-1开始向后看,而codePointAt()需要从index开始向前看。可能重复到不重复。我问的是codePointBefo

是否有任何使用案例表明使用
codePointBefore()
会有好处?如果你有索引,你已经可以
codepoint(i-1)

一个代码点可能由多个仍然存在的
字符组成。在其基础数组的索引中指定给方法的索引
char[]value
不是代码点的索引。这些检查边界和换行方法包括:


差异很重要,因为
索引-1
并不总是前一个代码点的起点;因此
codePointBefore()
需要从
index-1
开始向后看,而
codePointAt()
需要从
index
开始向前看。

可能重复到不重复。我问的是
codePointBefore()
在用例场景中作为
codePointAt()
的替代方案的相关性。我认为您正在寻找不同的规范。根据Oracle Javadocs,签名是:
int-codepoint(int-index)
int-codePointBefore(int-index)
:不,我引用的是
字符
方法
字符串
包装。如果你给我一分钟,我也可以发布字符串代码。那么
codePointAt()
认为代理代码点与其父代码点是分开的吗?我知道
codePointCount()
将复合对视为单个代码点。但是,由于实现是在一个char数组上执行的,因此索引必须使用String.length()而不是String.codePointCount(),正如我所假设的那样。你能证实吗?我正试图掌握在Java中处理Unicode和代码点时的作用。我来自这里:是的。字符串是基于给定16位固定长度的char构建的,所以index是指字符串中char[]的索引,无论它是否是高代理项。
//Java 8 java.lang.String source code
public int codePointAt(int index) {
    if ((index < 0) || (index >= value.length)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return Character.codePointAtImpl(value, index, value.length);
}
//...
public int codePointBefore(int index) {
    int i = index - 1;
    if ((i < 0) || (i >= value.length)) {
        throw new StringIndexOutOfBoundsException(index);
    }
    return Character.codePointBeforeImpl(value, index, 0);
}
//Java 8 java.lang.Character source code
static int codePointAtImpl(char[] a, int index, int limit) {
    char c1 = a[index];
    if (isHighSurrogate(c1) && ++index < limit) {
        char c2 = a[index];
        if (isLowSurrogate(c2)) {
            return toCodePoint(c1, c2);
        }
    }
    return c1;
}
//...
static int codePointBeforeImpl(char[] a, int index, int start) {
    char c2 = a[--index];
    if (isLowSurrogate(c2) && index > start) {
        char c1 = a[--index];
        if (isHighSurrogate(c1)) {
            return toCodePoint(c1, c2);
        }
    }
    return c2;
}