这是 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
  • 有效的Unicode字符串不应该包含\uFFFF是真的吗?
  • 如果是真的,那么Java是否“破坏了”代码,从而违反了Unicode规范(在大多数情况下)仍允许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/

    10-16 13:07
    查看更多