РЕДАКТИРОВАТЬ (2013-12-17): Питер О. поднимает отличную точку ниже, что делает этот ответ неверным.Старый ответ ниже, для исторической точности.
Отвечая на ваши вопросы:
Не нарушена ли предписанная идиома обхода, потому что она делает неверное предположение о \ uFFFF?
Нет.U + FFFF - это так называемый не-символ.С Раздел 16.7 Стандарта Юникода :
Нехарактеры - это кодовые точки, которые постоянно зарезервированы в Стандарте Юникода для внутреннего использования.Они запрещены для использования в открытом обмене текстовыми данными Unicode.
...
Стандарт Unicode выделяет 66 кодовых символов без символов.Последние две кодовые точки каждой плоскости не являются символами: U + FFFE и U + FFFF на BMP, U + 1FFFE и U + 1FFFF на плоскости 1 и т. Д., Вплоть до U + 10FFFE и U + 10FFFF на плоскости 16,в общей сложности 34 кодовых балла.Кроме того, в BMP существует непрерывный диапазон еще 32 нехарактерных кодовых точек: U + FDD0..U + FDEF.
Является ли реализация StringCharacterIterator «сломанной», поскольку она, например, не выбрасываетIllegalArgumentException, если на самом деле \ uFFFF запрещен в допустимых строках Unicode?
Не совсем.Приложениям разрешается использовать эти кодовые точки внутри любым способом, который они хотят.Еще раз процитируем стандарт:
Приложения могут свободно использовать любые из этих кодовых точек, не являющихся символами, для внутреннего использования, но если никогда не попытается их заменить.Если в открытом обмене получен нехарактер, приложение не обязано каким-либо образом его интерпретировать.Однако рекомендуется распознать его как нехарактерный символ и предпринять соответствующие действия, например заменить его символом U + FFFD REPLACEMENT CHARACTER, чтобы указать на проблему в тексте.Не рекомендуется просто удалять нехарактерные кодовые точки из такого текста из-за потенциальных проблем безопасности, вызванных удалением неинтерпретированных символов.
Поэтому, пока вы никогда не встретите такую строку от пользователя, другого приложенияили файл, вы вполне можете поместить его в строку Java, если знаете, что делаете (хотя в основном это означает, что вы не можете использовать CharacterIterator в этой строке, хотя.
Действительно ли это верно, что действительный UnicodeСтроки не должны содержать \ uFFFF?
Как указано выше, любая строка, используемая для обмена , не должна содержать их. В вашем приложении вы можете использовать их любым способом, который они захотят.
Конечно, Java char
, представляющая собой просто 16-разрядное целое число без знака, на самом деле не заботится о значении, которое оно содержит.
Если это так, то Java "не работает""за нарушение спецификации Юникода из-за того, что (в большинстве случаев) позволяет String содержать \ uFFFF в любом случае?
Нет. В fНапример, в разделе, посвященном нехарактерам, даже предлагается использовать U + FFFF в качестве значения часового:
Фактически, нехарактеры можно рассматривать как внутренние точки приложения для частного использования.В отличие от символов частного использования, описанных в Раздел 16.5, Символы частного использования , которым назначены символы и которые предназначены для использования в открытом обмене при условии их интерпретации по частному соглашению, нехарактерные символы зарезервированы (не назначены) на постоянной основе.и не имеют никакой интерпретации вне их возможного частного использования внутри приложения.
U + FFFF и U + 10FFFF. Эти две нехарактерные кодовые точки имеют атрибут, связанный с наибольшим кодомзначения единиц для определенных форм кодирования Unicode.В UTF-16 U + FFFF ассоциируется с наибольшим значением 16-битной кодовой единицы, FFFF 16 .U + 10FFFF ассоциируется с наибольшим допустимым значением единицы UTF-32 в коде 32-битного кода, 10FFFF 16 .Этот атрибут делает эти две нехарактерные кодовые точки полезными для внутренних целей в качестве часовых.ЗаНапример, они могут использоваться для указания конца списка, для представления значения в индексе, которое гарантированно будет выше, чем любое допустимое символьное значение, и т. д.возвращает U + FFFF, когда больше нет доступных символов.Конечно, это означает, что если у вас есть другое использование этой кодовой точки в вашем приложении, вы можете рассмотреть возможность использования другого не символьного для этой цели, поскольку U + FFFF уже используется - по крайней мере, если вы используете CharacterIterator.