Почему Java не распознает эти пробелы? - PullRequest
1 голос
/ 05 августа 2020

Есть 25 типов пробелов . Character.isWhitespace(char) в приведенном ниже коде показывает, что четыре из 25 типов не считаются пробелами в Java. Почему?

public class Main {
    public static void main(String...args){
        char [] whiteSpaces = {'\u0085', '\u00A0', '\u2007', '\u202F'};
        for(char space : whiteSpaces){
            //All spaces are not white spaces in Java.
            System.out.println("[" + space + "] is a white space in Java:" + Character.isWhitespace(space));
        }
    }
}

Обратитесь - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Character.html#isWhitespace (char)

Ответы [ 3 ]

4 голосов
/ 05 августа 2020

Почему? Потому что так определяется этот метод. javado c для isWhiteSpace перечисляет коды, которым он соответствует. 4, которые вы определили, отсутствуют в списке.

Мы не можем сказать вам, почему это было определено таким образом. Однако одно из следствий того, что говорит javado c, заключается в том, что '\u00A0', '\u2007' и '\u202F' исключаются, потому что они являются неразрывными пробелами.

'\u0085' или NEL - интересный случай. Согласно таблицам кодов Unicode (см. здесь для неофициального резюме), он НЕ является членом общих категорий SPACE_SEPARATOR, LINE_SEPARATOR или PARAGRAPH_SEPARATOR. (Он отображается в категории CONTROL.)

Если вам нужен метод, распознающий все символы пробелов Unicode (т.е. символы в SPACE_SEPARATOR, LINE_SEPARATOR или PARAGRAPH_SEPARATOR), вы должны использовать isSpaceChar ( javado c) вместо isWhiteSpace.

Обратите внимание, что SPE c Unicode не является постоянным. Категоризация кодов и определение «пустого пространства» со временем эволюционировали. Каждая версия Java реализует определенную c версию c Unicode, которая была актуальной на момент ее выпуска. Например:

  • Java 8 реализует Unicode 6.2
  • Java 11 реализует Unicode 10.0.0
  • Java 13 реализует Unicode 12.1

Подробности указаны в javado c для класса Character для каждой версии Java. Обратите внимание, что данный выпуск Java НЕ исправлен для отслеживания последующих выпусков Unicode.

Суть в том, что «белое пространство» - довольно скользкое понятие. Если вам нужен метод, реализующий конкретное значение c, возможно, вам придется реализовать его самостоятельно.

3 голосов
/ 05 августа 2020

Если вы читаете документацию , то есть javado c из Character.isWhitespace(char), он говорит:

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

  • Это пробельный символ Unicode (SPACE_SEPARATOR, LINE_SEPARATOR или PARAGRAPH_SEPARATOR) , но не является также неразрывным пробелом ('\u00A0', '\u2007', '\u202F') .
  • Это '\t', U+0009 HORIZONTAL TABULATION.
  • Это это '\n', U+000A LINE FEED.
  • Это '\u000B', U+000B VERTICAL TABULATION.
  • Это '\f', U+000C FORM FEED.
  • Это '\r', U+000D CARRIAGE RETURN.
  • Это '\u001C', U+001C FILE SEPARATOR.
  • Это '\u001D', U+001D GROUP SEPARATOR.
  • Это '\u001E' , U+001E RECORD SEPARATOR.
  • Это '\u001F', U+001F UNIT SEPARATOR.

3 из 4 перечисленных вами явно исключены, потому что они не являются разбиение пробелов .

Что касается U+0085 NEXT LINE (NEL), это не пробел Юникода, и он не считается пробельным символом Java, как вы можете видеть в этом javado c.

1 голос
/ 05 августа 2020

Java, похоже, нигде не отображает список пробелов Unicode

В Java isWhitespace специально определяется как один из следующих:

  • Это Unicode символ пробела (SPACE_SEPARATOR, LINE_SEPARATOR или PARAGRAPH_SEPARATOR), но не является неразрывным пробелом ('\ u00A0', '\ u2007', '\ u202F').
  • Это '\ t', U +0009 ГОРИЗОНТАЛЬНАЯ ТАБЛИЦА.
  • Это '\ n', ЛИНИЯ ПОДАЧИ U + 000A.
  • Это '\ u000B', ВЕРТИКАЛЬНАЯ ТАБЛИЦА U + 000B.
  • Это это '\ f', U + 000 C ПОДАЧА ФОРМЫ.
  • Это '\ r', U + 000D ВОЗВРАТ ПЕРЕВОЗКИ.
  • Это '\ u001 C', U + 001 C РАЗДЕЛИТЕЛЬ ФАЙЛОВ.
  • Это '=', U + 001D РАЗДЕЛИТЕЛЬ ГРУПП.
  • Это '\ u001E', U + 001E РАЗДЕЛИТЕЛЬ ЗАПИСЕЙ.
  • Это '\ u001F', U + 001F UNIT SEPARATOR.

Java также делает доступными пробелы , но не пробелы Unicode, через Character.isSpaceChar(). Это немного другой список.

char [] whiteSpaces = {'\u0085', '\u00A0', '\u2007', '\u202F'};
        for(char space : whiteSpaces){
            //All spaces are not white spaces in Java.
            System.out.println("[" + space + "] is a white space in Java: " + Character.isWhitespace(space) + " Unicode: " + Character.isSpaceChar(space));
        }

Вывод:

[] is a white space in Java: false Unicode: false
[ ] is a white space in Java: false Unicode: true
[ ] is a white space in Java: false Unicode: true
[ ] is a white space in Java: false Unicode: true

Если для вашего приложения важно, чтобы ваше приложение соответствовало спецификациям Unicode, а не java, просто определите его самостоятельно .

...