Почему неразрывное пространство не является пробельным символом в Java?

По какой-то причине в каждом посте, спрашивающем о переводе новой строки в PHP, не упоминается случай, когда простая вставка новой строки в строки в одинарных кавычках будет делать именно то, что вы думаете:

ex 1.

 echo 'foo\nbar';

Пример 1 явно не печатает желаемый результат, однако, хотя это правда, что вы не можете избежать перехода на новую строку в одинарных кавычках, у вас может быть один:

из 2.

 echo 'foo
 bar';

Пример 2 имеет точно желаемое поведение. К сожалению, добавленная новая строка зависит от операционной системы. Обычно это не проблема, так как веб-браузеры / серверы правильно интерпретируют новую строку, будь то \ r, \ r \ n или \ n.

Очевидно, что это решение не идеально, если вы планируете распространять файл с помощью других средств, а не через веб-браузер, и на несколько операционных систем. В этом случае вы должны увидеть один из других ответов.

примечание: используя многофункциональный текстовый редактор, вы сможете вставить новую строку в виде двоичного символа (ов), который представляет новую строку в операционной системе, отличной от той, которая редактирует файл. Если ничего не помогает, достаточно использовать шестнадцатеричный редактор для вставки двоичного символа ascii.

30
задан Palimondo 29 June 2009 в 21:33
поделиться

5 ответов

Character.isWhitespace (char) устарел. Действительно старый. Многие вещи, сделанные на заре Java, следовали соглашениям и реализациям C.

Теперь, более десяти лет спустя, эти вещи кажутся ошибочными. Считайте это свидетельством того, как далеко продвинулись дела даже между первыми днями Java и первыми днями .NET.

Java стремится быть на 100% обратно совместимой. Таким образом, даже если бы команда Java подумала, что было бы хорошо исправить свою первоначальную ошибку и добавить неразрывные пробелы к набору символов, который возвращает true из Character.isWhitespace (char), они не могут, потому что почти наверняка существует программное обеспечение, которое полагается на текущую реализацию, работающую точно так же.

22
ответ дан 27 November 2019 в 23:36
поделиться

Я бы сказал, что реализация Java более правильна, чем реализация .NET. Неразрывный пробел - это, по сути, непробельный символ, который выглядит как один. То есть, если у вас есть строки «foo» и «bar» и поместите между ними любой традиционный символ пробела, вы получите разрыв слова. Однако неразрывное пространство не разделяет их.

7
ответ дан 27 November 2019 в 23:36
поделиться

Похоже, название метода ( isWhitespace ) несовместимо с его функцией (обнаруживать разделители). Функциональность «разделителя» становится довольно ясной, если вы посмотрите полный список символов со страницы Javadoc, которую вы процитировали:

* It is a Unicode space character (SPACE_SEPARATOR, LINE_SEPARATOR, or PARAGRAPH_SEPARATOR) but is not also a non-breaking space ('\u00A0', '\u2007', '\u202F').
* It is '\u0009', HORIZONTAL TABULATION.
* It is '\u000A', LINE FEED.
* It is '\u000B', VERTICAL TABULATION.
* It is '\u000C', FORM FEED.
* It is '\u000D', CARRIAGE RETURN.
* It is '\u001C', FILE SEPARATOR.
* It is '\u001D', GROUP SEPARATOR.
* It is '\u001E', RECORD SEPARATOR.
* It is '\u001F', UNIT SEPARATOR. 

Функция неразрывного пробела должна быть визуальным пространством между словами, которое не разделяется алгоритмами расстановки переносов.

2
ответ дан 27 November 2019 в 23:36
поделиться

Единственный случай, когда неразрывные пробелы следует обрабатывать специально, - это код, предназначенный для переноса текста по словам.

Для всех других целей, включая подсчет слов, обрезку и общие -целевое разделение по границам слова, неразрывный пробел по-прежнему остается пробелом .

Любой аргумент, что неразрывный пробел просто «выглядит» как пробел, но не конфликтует со всей точкой Unicode, который представляет символы в зависимости от их значения, а не того, как они отображаются.

Таким образом, IMHO, Java-реализация String.trim () не работает, как ожидалось, а базовая функция Character.isWhitespace () находится на ошибка.

Я предполагаю, что разработчики Java написали isWhitespace (), исходя из необходимости выполнять перенос текста внутри элементов управления.Им следовало назвать эту функцию isWordWrappingBoundary () или как-нибудь более понятным и использовать менее строгий тест на пробелы для trim ().

6
ответ дан 27 November 2019 в 23:36
поделиться

Начиная с Java 5 существует также метод isSpaceChar (int) . Разве это не дает того, что вы хотите?

Определяет, является ли указанный символ (кодовая точка Unicode) пробелом Unicode. Символ считается пробелом тогда и только тогда, когда он определен как пробел по стандарту Unicode. Этот метод возвращает истину, если тип общей категории персонажа является одним из следующих: ...

14
ответ дан 27 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: