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


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)?


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>для устранения неоднозначности этих функций «новой строки». Но на практике эти персонажи мало привыкли.


1
Хорошее объяснение, однако для меня это означает: один разрыв строки на руководителя комитета.
— Maaartinus

5
@maaartinus Нет. Один разрыв строки для всех предыдущих противоречивых стандартов и еще два однозначных из стандарта Unicode.
— Milind R

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.