这是 java.text.CharacterIterator
文档的摘录:
斜体部分是我难以理解的部分,因为从我的测试中看来,它看起来像Java的String
可以肯定包含\uFFFF
,并且似乎没有任何问题,除非显然存在规定的CharacterIterator
遍历习惯用法由于误报而中断(例如,在不是真的“完成”时,next()
返回'\uFFFF' == DONE
)。
以下是说明“问题”(see also on 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
实现的“中断”,因为它没有throw
如果实际上在有效的Unicode字符串中禁止IllegalArgumentException
,则是\uFFFF
? \uFFFF
是真的吗? String
包含\uFFFF
? 最佳答案
编辑(2013-12-17): Peter O.在下面提出一个要点,这使该答案是错误的。下面的旧答案用于历史准确性。
回答您的问题:
所规定的遍历惯用法是否“破”了,因为它对\ uFFFF做出了错误的假设?
不可以。U+ FFFF是所谓的非字符。从Section 16.7 of the Unicode Standard:
StringCharacterIterator实现是否“中断”,因为它没有如果实际上在有效的Unicode字符串中禁止\ uFFFF,则抛出IllegalArgumentException?
不完全的。允许应用程序以他们想要的任何方式在内部使用这些代码点。再次引用标准:
因此,尽管您永远都不会遇到来自用户,其他应用程序或文件的这样的字符串,但如果知道您在做什么,则可以将其放入Java字符串中(这基本上意味着您不能在该字符串上使用CharacterIterator,虽然。
有效的Unicode字符串实际上不应包含\ uFFFF吗?
如上所述,用于交换的任何字符串都不得包含它们。在您的应用程序中,您可以随意使用它们所需的任何方式。
当然,Java char
只是一个16位无符号整数并不真正在乎它所拥有的值。
如果是真的,那么Java是否“破坏了”(通过大多数情况下)通过允许String包含\ uFFFF来违反Unicode规范?
否。实际上,关于非字符的部分甚至建议使用U + FFFF作为标记值:
CharacterIterator遵循此方法,因为在没有更多可用字符时,它将返回U + FFFF。当然,这意味着,如果您在应用程序中对该代码点有其他用途,则可以考虑为此使用另一个非字符,因为已经使用了U + FFFF –至少在使用CharacterIterator的情况下。
关于java - 有效的Unicode字符串可以包含FFFF吗? Java/CharacterIterator是否损坏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3482683/