Почему в Юникоде так много пробелов и разрывов строк?

19

Unicode может иметь 50 пробелов

\ U0009 \ u000A- \ u000d \ u0020 \ u0085 \ u00A0 \ u1680 \ u180E \ u2000- \ u200A \ u2028 \ u2029 \ u202F \ u205F \ u3000] [\ u0009 \ u000A- \ u000d \ u0020 \ u0085 \ u00A0 \ u1680 \ u180E \ u2000- \ u200A \ u2028 \ u2029 \ u202F \ u205F \ u3000

и 6 разрывов строки

не только CRLF, LF, CR, но также NEL (U + 0085), PS (U + 2029) и LS (U + 2028).

Может быть, я мог бы понять большинство пробелов и PS («Разделитель абзацев»), но для чего хороши «Следующая строка» и «Разделитель строк»?

Все это похоже на то, что изобрел очень большой комитет, где каждый хотел иметь свое место, а лидерам был предоставлен один разрыв строки. А если серьезно, как вы справляетесь с этим, когда ваш язык программирования не поддерживает его (или делает это неправильно, как, например, Java)?

maaartinus
источник
1
Как Java делает это «неправильно»?
Билли Онил
Почти полностью, с. stackoverflow.com/questions/4304928/…
maaartinus
2
@maaartinus: (Я не могу поверить, что защищаю Java от всех вещей). Классы символов Java задокументированы для применения к определенному набору символов. Unicode предоставляет больше символов, которые выглядят так, как будто они вписываются в эти классы символов, но Unicode не определяет языки регулярных выражений; только кодировки символов. Java ведет себя совершенно корректно в соответствии со своей спецификацией, то есть соответствует типичному пробелу. Если вы хотите, чтобы он соответствовал всему стандарту Unicode, который может рассматриваться как пустое пространство, вам придется написать это самостоятельно.
Билли Онил
2
Спасибо за информацию. Тем не менее, они могут создать Pattern.compile2010метод, возвращающий регулярные выражения, работающие в соответствии с определением прошлых лет. Они также могут свободно создавать метод, Pattern.compileLatestUTSкоторый бы явно указывал, что значение будет меняться в соответствии с новой спецификацией.
Маартин
2
Похоже , Java в конечном итоге сделал исправление / модернизировать их регулярки реализации, с использованием неавтоматического флага для предотвращения назад проблем совместимости: stackoverflow.com/a/4307261/1172352
peterflynn

Ответы:

15

Может быть, я мог бы понять большинство пробелов и PS («Разделитель абзацев»), но чем хороши «Следующая строка» и «Разделитель строк»

Следующая строка (U + 0085) часто используется как символ новой строки в системах EBCDIC (как 0x15). Это как CR + LF, но как один символ.

LINE SEPARATOR (U + 2028) и PARAGRAPH SEPARATOR (U + 2029) объясняются в разделе 5.8 стандарта Unicode , который описывает их как текстовую версию HTML <br>и <p>для устранения неоднозначности этих функций «новой строки». Но на практике эти персонажи мало привыкли.

dan04
источник
1
Хорошее объяснение, однако для меня это означает: один разрыв строки на руководителя комитета.
Maaartinus
5
@maaartinus Нет. Один разрыв строки для всех предыдущих противоречивых стандартов и еще два однозначных из стандарта Unicode.
Milind R
9
xkcd.com/927
dan04 12.12.14