Здесь выдержка из java.text.CharacterIterator
:
Этот
interface
определяет протокол для двунаправленной итерации по тексту. Итератор выполняет итерацию по ограниченной последовательности символов. [...] Методыprevious()
иnext()
используются для итерации. Они возвращаютDONE
, если [...], сигнализируя, что итератор достиг конца последовательности.
static final char DONE
: Константа, которая возвращается, когда итератор достиг конца или начала текста. Значение\uFFFF
, значение "не символа", которое не должно происходить ни в одной из допустимых строк Unicode.
Курсивная часть - это то, что у меня проблемы с пониманием, потому что из моих тестов похоже, что 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
? - Является ли реализация
StringCharacterIterator
"сломанной", потому что она не является, например,throw
aIllegalArgumentException
, если на самом деле\uFFFF
запрещено в действительных строках Unicode? - Действительно ли верно, что действующие строки Unicode не должны содержать
\uFFFF
? - Если это правда, тогда Java "сломан" для нарушения спецификации Unicode (для большинства частей), позволяя
String
содержать\uFFFF
в любом случае?