2016-08-24 6 views
0

С учетом String string в Java, string.codePoints().toArray().length отражает длину String с точки зрения фактических персонажей, которые человек нашел бы значимыми? Другими словами, он сглаживает escape-символы и другие артефакты кодирования?Если я использую String.codePoints Java 8 для получения массива int codePoints, верно ли, что длина массива - это количество символов?

Редактировать Под «человеческим» Я отчасти имел в виду «программист», как я предположил бы, что большинство программистов увидит \r\n как два символа, ESC как один символ, и т.д. Но теперь я вижу, что даже надстрочные знаки получить распыляется так это не имеет значения.

+0

Было бы намного легче ответить на ваш вопрос, если бы вы могли привести несколько строк и несколько результатов, которые вы ищете. Люди странные: D – visch

+3

Быстрое испытание говорит: 'String s =" s \ n ";' 'length()' = 2 и 'codePoints(). ToArray(). Length' = 2. – Zircon

+0

Это не совсем то, что Я имел в виду по моему вопросу, но вы правы. Я имел в виду больше ... «программист видел бы» –

ответ

6

Номер

Например:

  • Управляющие символы (такие как ESC, CR, NL, и так далее), не будут удалены. Они имеют различные кодовые обозначения в Unicode.

  • Последовательности пространства, вкладки и т.д. не объединяются

  • Дискреционный дефис (http://www.fileformat.info/info/unicode/char/00AD/index.htm) символы не удаляются.

  • Унифицированные символы Unicode (https://en.wikipedia.org/wiki/Combining_character) не объединены.


Теперь спорно ли некоторые из них могут быть «реальные персонажи, что человек будет найти смысл» ... но в целом ответ по-прежнему номер


Вы уточнили следующее:

Под «человеческим» я вроде как «программист», как я представляю, большинство программистов wo uld см. \ r \ n как два символа ...

Это сложнее, чем это. Я программист, и для меня это зависит от контекста, являются ли значения \r\n или нет. Если я читаю файл README, мой мозг будет рассматривать различия в белом пространстве как имеющие смысловое значение. Но если я пишу парсер, мой код будет учитывать пробелы ... в зависимости от языка, на котором он предназначен, для анализа.

0

String object.codePoints() возвращает поток символов в Java 8.On, к которому вы вызываете метод toArray, поэтому он будет обрабатывать каждый символ в отдельном порядке и будет возвращать количество символов.

1

Просто проверьте Javadoc из CharSequence для кодовых значений() метод:

Возвращает поток значений точек кода из этой последовательности. Любые суррогатные пары, встречающиеся в последовательности, объединены, как если бы с помощью Character.toCodePoint, и результат передается потоку. Любые другие единицы кода, включая обычные символы BMP, непарные суррогаты и неопределенные кодовые единицы, имеют нулевое расширение до значений int, которые затем передаются в поток.https://docs.oracle.com/javase/8/docs/api/java/lang/CharSequence.html#codePoints--

И один в классах Струнные связанных с кодовыми, чтобы понять, что точка код:

String (INT [] кодовые, Int смещения, количество INT) Выделяет новую строку , который содержит символы из подмассива аргумента массива символов кода Unicode. https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

Точка код является INT, представляющий точку кода Unicode (https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#unicode), так что все символы включены даже те, не-читаемый человеком.