Pourquoi y a-t-il tant d'espaces et de sauts de ligne en Unicode?

19

Unicode a peut-être 50 espaces

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

et 6 sauts de ligne

non seulement CRLF, LF, CR, mais aussi NEL (U + 0085), PS (U + 2029) et LS (U + 2028).

Peut-être que je pourrais comprendre la plupart des espaces et PS ("Séparateur de paragraphe"), mais à quoi servent "Next Line" et "Line separator"?

Tout cela semble inventé par un très grand comité où tout le monde voulait son propre espace et les dirigeants ont obtenu une coupure de ligne chacun. Mais sérieusement, comment le traitez-vous lorsque votre langage de programmation ne le prend pas en charge (ou est-ce mal comme par exemple Java)?

maaartinus
la source
1
Comment Java le fait-il "à tort"?
Billy ONeal
Presque complètement, l'art. stackoverflow.com/questions/4304928/…
maaartinus
2
@maaartinus: (Je ne peux pas croire que je défende Java de toutes choses) Les classes de caractères Java sont documentées pour s'appliquer à un ensemble spécifique de caractères. Unicode fournit plus de caractères qui semblent correspondre à ces classes de caractères, mais Unicode ne définit pas de langages d'expression régulière; uniquement les encodages de caractères. Java se comporte complètement correctement selon ses spécifications - c'est-à-dire pour correspondre aux espaces blancs typiques. Si vous voulez qu'il corresponde à tout ce qui peut être considéré comme un espace vide dans la norme Unicode, vous devrez l'écrire vous-même.
Billy ONeal
2
Merci pour l'info. Cependant, mais ils sont libres de créer une Pattern.compile2010méthode renvoyant des expressions régulières fonctionnant selon la définition de l'année dernière. Ils sont également libres de créer une méthode Pattern.compileLatestUTSqui indiquerait explicitement que la signification changerait en fonction de nouvelles spécifications.
maaartinus
2
On dirait que Java a finalement fait fix / moderniser leur mise en œuvre regex, au moyen d' un opt-in drapeau afin d' éviter des problèmes de compatibilité arrière: stackoverflow.com/a/4307261/1172352
peterflynn

Réponses:

15

Peut-être que je pourrais comprendre la plupart des espaces et PS ("Séparateur de paragraphe"), mais à quoi servent "Next Line" et "Line separator"

NEXT LINE (U + 0085) est souvent utilisé comme caractère de nouvelle ligne sur les systèmes EBCDIC (comme 0x15). C'est comme CR + LF, mais comme un seul personnage.

SÉPARATEUR DE LIGNE (U + 2028) et SÉPARATEUR DE PARAGRAPHE (U + 2029) sont expliqués dans la section 5.8 de la norme Unicode , qui les décrit comme une version en texte brut de HTML <br>et <p>, pour lever l'ambiguïté de ces fonctions de "nouvelle ligne". Mais en pratique, ces personnages ne sont pas beaucoup utilisés.

dan04
la source
1
Bonne explication, mais pour moi, cela signifie: un saut de ligne par chef de comité.
maaartinus
5
@maaartinus Nope. Un saut de ligne par toutes les normes en conflit précédentes, et 2 autres sans ambiguïté de la norme Unicode.
Milind R
9
xkcd.com/927
dan04