java.text.CharacterIterator
文档的一部分:这个接口定义了一个文本的双向迭代协议。迭代器遍历一个有限序列的字符。previous()和next()方法用于迭代。如果...,它们将返回DONE,表示迭代器已到达序列的末尾。
static final char DONE
:当迭代器到达文本的结尾或开头时返回的常量。该值为\uFFFF
,“不是字符”的值,在任何有效的Unicode字符串中都不应出现。我不理解的是加粗的部分,因为根据我的测试,Java
String
明显可以包含 \uFFFF
,并且似乎没有任何问题,除了预定的 CharacterIterator
遍历惯用语会因错误的判断而中断(例如,当实际上没有结束时,next()
返回 '\uFFFF' == DONE
)。下面是一个代码片段来说明这个“问题”(在ideone.com上也可见):import java.text.*;
public class CharacterIteratorTest {
// this is the prescribed traversal idiom from the documentation
public static void traverseForward(CharacterIterator iter) {
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
System.out.print(c);
}
}
public static void main(String[] args) {
String s = "abc\uFFFFdef";
System.out.println(s);
// abc?def
System.out.println(s.indexOf('\uFFFF'));
// 3
traverseForward(new StringCharacterIterator(s));
// abc
}
}
那么这里发生了什么?
- 指定的遍历习惯用法是否“失效”,因为它对
\uFFFF
做出了错误的假设? StringCharacterIterator
实现是否“失效”,因为它没有例如在有效的Unicode字符串中禁止\uFFFF
时抛出IllegalArgumentException
?- 实际上,有效的Unicode字符串不应包含
\uFFFF
吗? - 如果是这样,那么Java是否“失效”,因为(大多数情况下)允许
String
包含\uFFFF
而违反了Unicode规范?
0xffff char
不是字符串终止符” - polygenelubricants0xffff
。这些值可能需要通过调用诸如...等函数来与实际的U+ffff
文本内容区分开来...” - polygenelubricantschar
实际上保存了一个字符(或者码点 - 作为通常[人类]意义上的字符将是一个可以任意长的图形素) ,而是保存了一个单个的UTF-16代码单元。它并没有出错,只是一种处理Unicode的特定方式而已。顺便说一句,Windows也是一样。 - Joey