java.text.CharacterIterator
ドキュメントからの抜粋は次のとおりです。
これ
interface
は、テキストに対する双方向反復のプロトコルを定義します。イテレータは、限定された一連の文字を繰り返し処理します。[...] メソッドprevious()
とnext()
は反復に使用されます。[...] の場合に返さDONE
れ、イテレータがシーケンスの最後に到達したことを示します。
static final char 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
ですか? - それが本当なら、(ほとんどの部分で)とにかく
String
含むことを許可することによって、Unicode 仕様に違反するために Java は「壊れている」のでしょうか?\uFFFF