Как мне проверить, является ли символ символом новой строки Unicode (не только ASCII) в Rust?

Каждый язык программирования имеет свою интерпретацию \n и \r. Юникод поддерживает несколько символов, которые могут представлять новую строку.

Из справочника по Rust:

Пробел - это один из символов U + 006E (n), U + 0072 (r) или U + 0074 (t), обозначающих значения Unicode U + 000A (LF), U + 000D (CR) или U + 0009 (HT) соответственно.

Основываясь на этом утверждении, я бы сказал, что символ Rust является символом новой строки, если это либо \n, либо \r. В Windows это может быть комбинация \r и \n. Хотя я не уверен.

А как насчет следующего?

  • Символ следующей строки (U + 0085)
  • Символ-разделитель строк (U + 2028)
  • Символ-разделитель абзацев (U + 2029)

На мой взгляд, нам не хватает чего-то вроде char.is_new_line(). Я просмотрел Категории символов Юникода, но не смог найти определение для новые строки.

Должен ли я придумывать собственное определение того, что такое символ новой строки Unicode?


person Noel Widmer    schedule 09.07.2017    source источник


Ответы (1)


Между такими языками, как Java, Python, Go и JavaScript, существуют значительные практические разногласия относительно того, что представляет собой символ новой строки и как это переводится в «новые строки». Несогласие демонстрируется тем, как движки регулярных выражений с включенными батареями обрабатывают шаблоны типа $ против строки типа \r\r\n\n в многострочном режиме: есть ли две строки (\r\r\n, \n), три строки (\r, \r\n, \n, как говорит Unicode ) или четыре (\r, \r, \n, \n, как это видит JS)? Go и Python не рассматривают \r\n как единый $, как и контейнер регулярных выражений Rust; Однако у Java есть. Я не знаю ни одного языка, батареи которого расширяют обработку новой строки до каких-либо символов Unicode.

Итак, вывод здесь

  • Принято считать, что \n является новой строкой.
  • \r\n может быть одним символом новой строки
  • если \r\n не рассматривается как два символа новой строки
  • если \r\n не является "некоторым символом, за которым следует новая строка"
  • Кроме этого, у вас больше не будет новых строк.

Если вам действительно нужно больше символов Unicode, которые будут обрабатываться как новые строки, вам нужно будет определить функцию, которая сделает это за вас. Не ждите от реальных данных, которые этого ожидают. В конце концов, у нас был разделитель записей ASCII в течение миллиарда лет, и все вместо него также используют \t.

Обновление: см. http://www.unicode.org/reports/tr14/tr14-32.html#BreakingRules раздел LB5 о том, почему \r\r\n следует рассматривать как два разрыва строки. Вы можете прочитать всю страницу, чтобы понять, как должен быть реализован ваш исходный вопрос. Я предполагаю, что к тому моменту, когда вы дойдете до «Юго-Восточная Азия: разрывы строк требуют морфологического анализа», вы закроете вкладку :-)

person user2722968    schedule 09.07.2017
comment
Это очень хороший опрос, который у вас есть, я ожидал некоторой степени вариации, но, честно говоря, не НАСТОЛЬКО. Поскольку вы упомянули, как его видит Unicode, было бы здорово, если бы вы могли указать или указать, где он определен в Unicode, для резервного копирования вашего ответа. - person Matthieu M.; 09.07.2017