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