这是文档的摘录java.text.CharacterIterator
:
这
interface
定义了文本双向迭代的协议。迭代器迭代有界的字符序列。[...] 方法previous()
和next()
用于迭代。它们返回DONE
if [...],表示迭代器已到达序列的末尾。
static final char DONE
:当迭代器到达文本的结尾或开头时返回的常量。该值是不应出现在任何有效 Unicode 字符串中\uFFFF
的“非字符”值。
斜体部分是我难以理解的部分,因为从我的测试来看,它看起来像 JavaString
肯定可以包含\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
“损坏”,因为它没有例如if 实际上在throw
有效的 Unicode 字符串中是被禁止的?IllegalArgumentException
\uFFFF
- 有效的 Unicode 字符串不应该包含真的是真的
\uFFFF
吗? - 如果这是真的,那么 Java 是否因(在大多数情况下)允许
String
包含而违反 Unicode 规范而被“破坏”\uFFFF
?