Чому в Unicode так багато пробілів і розривів рядків?


19

У Unicode може бути 50 пробілів

\ u0009 \ u000A- \ u000D \ u0020 \ u0085 \ u00A0 \ u1680 \ u180E \ u2000- \ u200A \ u2028 \ u2029 \ u202F \ u205F \ u3000] [\ u0009 \ u000A- \ u000D \ u0020 \ u0085 \ u00A \ \ 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 робить це "неправильно"?
Біллі ONeal

Майже повністю, с. stackoverflow.com/questions/4304928 / ...
maaartinus

2
@maaartinus: (Я не можу повірити, що я захищаю Java всіх речей) Класи символів Java документовані для застосування до певного набору символів. Unicode надає більше символів, схожих на те, що вони вписуються в ці класи символів, але Unicode не визначає мови регулярних виразів; тільки кодування символів. Java поводиться абсолютно правильно відповідно до своїх специфікацій - тобто, щоб відповідати типовому пробілу. Якщо ви хочете, щоб він відповідав усьому стандарту Unicode, який може розглядатися як порожній простір, тоді вам доведеться написати це самостійно.
Біллі ONeal

2
Thx для інформації. Однак, але вони вільні створити Pattern.compile2010метод, що повертає регулярні вирази, що працюють відповідно до визначення останніх років. Вони також вільні створити метод, Pattern.compileLatestUTSякий би чітко стверджував, що значення змінюватиметься відповідно до нових специфікацій.
maaartinus

2
Схоже , Java в кінцевому підсумку зробив виправлення / модернізувати їх регулярки реалізації, з використанням неавтоматичного прапора для запобігання тому проблем сумісності: stackoverflow.com/a/4307261/1172352
peterflynn

Відповіді:


15

Можливо, я міг би зрозуміти більшість пробілів та PS ("роздільник абзаців"), але що таке "Наступний рядок" та "Роздільник рядків"?

NEXT LINE (U + 0085) часто використовується як символ нового рядка в системах EBCDIC (як 0x15). Це як CR + LF, але як один символ.

СЕПАРАТОР ЛІНІЇ (U + 2028) та ПАРАГРАФСЬКИЙ СЕПАРАТОР (U + 2029) пояснюються у розділі 5.8 стандарту Unicode , який описує їх як текстову версію HTML <br>та <p>розмежовує ці функції "нового рядка". Але на практиці ці персонажі не дуже звикають.


1
Хороше пояснення, проте для мене це означає: одна перерва у рядку на одного керівника комітету.
maaartinus

5
@maaartinus Nope. Один розрив рядка за всіма попередніми суперечливими стандартами та ще 2 однозначні від стандарту Unicode.
Milind R

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.