Attention : la lecture de ce billet est probablement plus aisée sur sa page originale.

Suite à des échanges sur Twitter avec Mitternacht, et surtout la lecture d'un article proposant une presque bonne idée, je me suis proposé pour faire la liste des caractères spéciaux d'espacements disponibles en Unicode, dans l'idée d'en faire parler sur le génialissime Typographisme.net.

Tout partait d'un article qui tentait d'aller plus loin que le simple espace (que l'on note ␣ et dans les tables techniques par ␠ pour faire le gars qui s'y connaît devant les clients) et l'espace insécable à peu près connu de tous (là, vous utilisez ⍽ comme signe cabalistique qui finira de mystifier votre interlocuteur).

Il faut dire qu'on peut avoir un besoin plus que ponctuel pour un espace spécial. Par exemple, toute ponctuation à deux-traits en Français, c'est à dire autres que le point ou la virgule, doit être précédée d'un espace, si possible insécable, à l'exception des guillemets où ils l'entourent. (Faudrait déjà que je parle comment le gérer au quotidien dans ma psychanalyse du clavier)
Vous pourriez considérer comme plus lisible d'utiliser un espace moins long d'une demi-largeur, mais au comportement insécable, c'est-à-dire n'entrainant pas un retour à la ligne.

Le billet qui a entraîné l'écriture de celui-ci préconisait l'usage d'une balise HTML stylée : <span class="demiespace">&nbsp;</span>.
Un usage du HTML qui ressemble plus à une contrainte et à un usage disgracieux de la sémantique. Ni franchement à faire, ni franchement pratique pour l'utilisateur lambda (songez à un copié-collé vers un éditeur).
Alors que l'Unicode dispose d'une incroyable palette de caractères ad hoc, parfois à l'absurde...

Car, il y a bien une chose très importante à savoir quand on touche du HTML aussi bien côté programmation, côté design que côté contenu, et avant même de connaître ses balises HTML par cœur ou les subtilités entre XHTML et HTML, c'est bien les caractères eux-mêmes !

Cela veut dire que si vos sites servent de l'Unicode (et qu'importe la variation d'encodage du charset, UTF-7, UTF-8 ou UCS-2, c'est à votre choix et à vos usages, voire UTF-32, UCS-4,...), tout va bien. Si vous êtes encore en jeux de caractères ISO-Latin ou pire, en Windows-1522, aux uniques exceptions de l'espace standard et du NBSP qui eux sont présents dans tous les jeux de caractères (“charsets”) 8 bits “simples”, il faudra utiliser les entités HTML (Je vais pas vous rappeler à quoi servent les entités HTML ?).

Hein⍽? Quoi⍽? vous avez déjà dégainé l'aspirine⍽?

Les entités HTML, c'est-à-dire la notation &nbsp;, ne sont pas toutes reconnues, alors que le code-point numérique ou “entité décimale” ou encore entité XML a plus de chances de passer : La notation &#180; faisant théoriquement appel directement à l'index numérique de la police de caractère elle-même.
Malheureusement, il se trouve que ça ne marche pas partout (Opera, du moins) et absolument pas garantie en dehors d'un charset Unicode.
Au moins, je vous aurais prévenu.

Il est très important aussi de noter que le support des caractères, voire des entités varie fortement selon l'encodage du document, mais aussi selon le système d'exploitation (très rare, mais Ms-Win XP est toujours là), les bibliothèques logicielles (si vous devez coder une regex, cela peut vous poser souci, ne parlons pas d'un Direct2D très vieux…), les logiciels eux-mêmes (MsIE6), les polices générales de votre OS qui ont été installées selon votre locale linguistique (principalement pour gérer une fallback), ou encore la police de caractère choisie pour l'affichage.

Fallbacks (solutions de replis)

Dans ce dernier cas, méfiez-vous car le navigateur web peut se retrouver à afficher en lieu et place, au “hasard” :

  • soit le caractère attendu, mais dans une autre police que prévue (et là, vous avez vraiment de la chance, ou votre ordi a tout simplement trop de polices systèmes),
  • soit un espace blanc plus ou moins de la bonne taille (dans le cas où vous tentez de faire afficher à MsIE un des espaces ci-dessous, ce qui N'est PAS le comportement attendu),
  • soit le code en clair de l'entité HTML si c'est ce que vous avez utilisé (ce qui est le comportement prévu en HTML en cas d'incompréhension),
  • soit ⬚​, le placeholder indiquant un point Unicode non-affiché, donnant fort obligeamment le code point en 4 chiffres hexa dans un carré (du ㍑ quoi),
  • soit ▯, le placeholder d'un caractère inconnu​,
  • soit �, le placeholder officiel d'un caractère invalide.
Ce qui n'arrangera pas la lisibilité de votre texte...

Le dernier point très important, c'est que les logiciels se réfèrent bien évidemment à la norme Unicode concernant la segmentation de texte pour ensuite appliquer les séparations que sont les espaces. Il est arrivé plus d'une fois de découvrir des petites surprises en lisant ce que l'industrie a prévu (dans ce PDF, chapitre 16.2).

Une table, des espaces… qui ont une largeur

Les boutons de tests permettent de vérifier le résultat sur ce paragraphe.

char Nom usuel T.R. Entité Point Unicode Plan/Jeu Codage UTF-8 Insécable Compatible Tests
Em Quad 4 &#8193; U+2001Ponctuation 0xE2 0x80 0x81 Non EMSP est recommandé
EMSP: Espace Em 4 &emsp; U+2003Ponctuation 0xE2 0x80 0x83 Non Tous
  Espace d'idéogramme 4 &#12288; U+3000Idéogrammes CJK 0xE3 0x80 0x80 Non ?
Espace largeur de figure 3 &#8199; U+2007Ponctuation 0xE2 0x80 0x87 Oui ?
Espace braille 3 &#10240; U+2800Braille 0xE2 0xA0 0x80 Oui ? sauf ⓐⓁ
  En Quad 2 &#8192; U+2000Ponctuation 0xE2 0x80 0x80 Non ENSP est recommandé
ENSP: Espace En 2 &ensp; U+2002Ponctuation 0xE2 0x80 0x82 Non Tous
Espace Tiers d'Em 1⅓ &emsp13; U+2004Ponctuation 0xE2 0x80 0x84 Non Tous, sauf ⓢⓐ
Espace largeur de ponctuation 1⅓ &#8200; U+2008Ponctuation 0xE2 0x80 0x88 Non ?
  Espace standard 1 &#32; U+0020ASCII 0x20 Non Tous
  NBSP: Espace insécable 1 &nbsp; U+00A0Latin-1 0xC2 0xA0 Oui Tous.
Espace Quart d'Em 1 &emsp14; U+2005Ponctuation 0xE2 0x80 0x85 Non Tous, sauf ⓢⓐ
Espace Sixième d'Em &#8198; U+2006Ponctuation 0xE2 0x80 0x86 Non ?
Espace maigre ½ &thinsp; U+2009Ponctuation 0xE2 0x80 0x89 Non Tous sauf
NNBSP: Espace maigre insécable ½ &#8239; U+202FPonctuation 0xE2 0x80 0x8F Oui ? sauf ⓐⓁ† (eh bé google?) et Opera
MMSP: Espace mathématique ½ &#8287; U+205FPonctuation 0xE2 0x81 0x9F Oui ? sauf ⓐⓁ
Espace fin ¼ &#8202; U+200APonctuation 0xE2 0x80 0x8A Non ?
MVS: Séparateur de voyelles Mongol ? &#6158; U+180EMongol 0xE1 0xA0 0x8E Non ?

Texte de test

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

(Allez-y, vous pouvez éditer ce paragraphe : la suite n'est que du faux-texte pour essayer les espaces)... Ah non attention, premièrement, il faut toute la splendeur du aware et je ne cherche pas ici à mettre un point ! C'est pour ça que j'ai fait des films avec des replicants. Si je t'emmerde, tu me le dis, ce n'est pas un simple sport car en vérité, la vérité, il n'y a pas de vérité et finalement tout refaire depuis le début Je ne voudrais pas rentrer dans des choses trop dimensionnelles, mais, je sais que, grâce à ma propre vérité le cycle du cosmos dans la vie... c'est une grande roue et c'est une sensation réelle qui se produit si on veut ! Et j'ai toujours grandi parmi les chiens. Et là, vraiment, j'essaie de tout coeur de donner la plus belle réponse de la terre ! Après il faut s'intégrer tout ça dans les environnements et il faut se recréer... pour recréer... a better you et c'est une sensation réelle qui se produit si on veut ! Ça respire le meuble de Provence, hein ?

La suite du tableau

Pour votre culture générale, voici les caractères d'espacement de largeur… nulle ! Pourquoi et en quoi de telles entités pourraient vous être utiles ?

Comme pour le HTML, ce n'est pas parce que la taille est nulle que la signification est quelconque : ces caractères ont une réelle signification sémantique (en fait, j'ai surtout coupé le tableau en deux pour pouvoir lire le texte de test en essayant les espacements que vous aurez le plus de chance d'utiliser).
Par exemple, vous pourriez avoir à indiquer où dans un mot une césure peut se faire, c'est-à-dire entre les syllabes. Cela peut surprendre, mais oui, j'ai eu recours à ZWSP dans des cas très précis (placer par jeu un mot très très long dans un article, sans faire pêter la mise-en-forme par un dépassement de colonne). C'est là qu'on est content d'avoir été civilement présenté à ce type de “symboles”.

char Nom usuel T.R. Entité Point Unicode Plan/Jeu Codage UTF-8 Insécable Compatible Tests
WJ: Séparateur de mots 0 &#8288; U+2060Ponctuation 0xE2 0x81 0xA0 Oui ? sauf
ZWSP: Espace nul 0 &#8203; U+200BPonctuation 0xE2 0x80 0x8B Non ?
ZWNJ: Espace nul non-joint 0 &zwnj; U+200CPonctuation 0xE2 0x80 0x8C Oui ?
ZWJ: Espace nul joint 0 &zwj; U+200DPonctuation 0xE2 0x80 0x8D Oui ?
͏ CGJ: Combo-jointeur de graphème 0 &#847; U+034FCombinaisons diatriques 0xCD 0x8F Oui ? sauf ⓐ. ✁
 ZWNBSP: Espace nul insécable,
BOM: Détrompeur d'encodage (mérite un billet)
0 &#65279; U+FEFFMise en forme Arabe-B,
Zone technique
0xEF 0xBB 0xBF Oui Tous mais déprécié

D'une manière assez amusante, en regex, aucun des caractères de ce deuxième tableau n'est un espace compris par le meta \s, (du moins pour mes libs) ; tout comme NBSP ce que je conçois, mais bizarrement aussi l'espace Braille en est exclu. Logique…? Néanmoins, le support Unicode dans les regex est censé apporter un jeu de propriétés étendues. J'avoue que j'ai eu la flemme de tester car là aussi, le support est très variable, mâme s'il s'agit d'un standard industriel.

Tests réalisés

J'ai conduit une batterie de tests assez limité, faute de temps. Le projet Doctype sur Google Code m'a été utile, et quelques relecteurs m'ont remonté des cas ésotériques. Pour pas trop agrandir la table, j'ai dû utiliser des symboles, désolé pour ceux qui ont une police système incomplète.

  • Firefox 4.0.1 sous Linux. ✁ indique un filtrage par copié-collé ⌈ ^+C , ^+V ⌋
  • Chrome 11 sous Linux
  • Ⓛ Links 2.3 en terminal X sous Linux
  • ⓐ Webkit sur Android 2.2, Samsung Galaxy S
  • ⓢ Safari 3, selon les références Google
  • † MsIE6, selon les références Google
  • ⚐ Indique un affichage conditionné soit par la locale système, soit par les polices installées, en plus du support selon les logiciels.

Références

Le texte du paragraphe de test généré par faux-texte.com. Total respect à JCVD, j'ai adoré ton film mais j'avais la flemme...

Commentaires et observations fortement bienvenus.