Por que existem tantos espaços e quebras de linha no Unicode?

19

Unicode tem talvez 50 espaços

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

e 6 quebras de linha

não apenas CRLF, LF, CR, mas também NEL (U + 0085), PS (U + 2029) e LS (U + 2028).

Talvez eu possa entender a maioria dos espaços e PS ("Separador de parágrafos"), mas para que servem "Next Line" e "Line separator"?

Tudo parece inventado por um comitê muito grande, onde todos queriam seu próprio espaço e os líderes recebiam uma quebra de linha cada. Mas, falando sério, como você lida com isso quando sua linguagem de programação não a suporta (ou faz errado como, por exemplo, Java)?

maaartinus
fonte
1
Como o Java faz isso "errado"?
quer
Quase completamente, s. stackoverflow.com/questions/4304928/…
maaartinus
2
@maaartinus: (Não acredito que estou defendendo o Java de todas as coisas) As classes de caracteres do Java estão documentadas para serem aplicadas a um conjunto específico de caracteres. O Unicode fornece mais caracteres que parecem se encaixar nessas classes de caracteres, mas o Unicode não define linguagens de expressão regular; apenas codificações de caracteres. O Java se comporta de maneira completamente correta, de acordo com suas especificações - ou seja, corresponde ao espaço em branco típico. Se você deseja que ele corresponda a tudo no padrão Unicode que possa ser visto como espaço vazio, será necessário escrever isso sozinho.
quer
2
Obrigado pela informação. No entanto, eles são livres para criar um Pattern.compile2010método que retorne expressões regulares que funcionem de acordo com a definição dos últimos anos. Eles também são livres para criar um método Pattern.compileLatestUTSque declararia explicitamente que o significado mudaria de acordo com a nova especificação.
Maaartinus
2
Looks como Java, eventualmente, fez fix / modernizar sua implementação regex, usando um sistema opt-in bandeira para evitar problemas de compatibilidade para trás: stackoverflow.com/a/4307261/1172352
peterflynn

Respostas:

15

Talvez eu possa entender a maioria dos espaços e PS ("Separador de parágrafos"), mas o que são "Next Line" e "Line separator" bons para

A NEXT LINE (U + 0085) é frequentemente usada como o caractere de nova linha nos sistemas EBCDIC (como 0x15). É como CR + LF, mas como um personagem.

O LINE SEPARATOR (U + 2028) e o PARAGRAPH SEPARATOR (U + 2029) são explicados na seção 5.8 do padrão Unicode , que os descreve como uma versão em texto sem formatação do HTML <br>e <p>, para desambiguar essas funções da "nova linha". Mas, na prática, esses personagens não se acostumam muito.

dan04
fonte
1
Boa explicação, no entanto, para mim significa: uma quebra de linha por líder de comitê.
Maaartinus
5
@maaartinus Nope. Uma quebra de linha por todos os padrões conflitantes anteriores e mais 2 não-ambíguos do padrão Unicode.
Milind R
9
xkcd.com/927
dan04