Il m'est arrivé une mésaventure avec les espaces insécables. Ce n'est pas la première fois, mais à chaque fois, je me dis que je ne me laisserais plus avoir.
Commençons par le début : qu'est-ce qu'une espace insécable ? C'est un caractère qui s'affiche comme une espace normale mais qui empêche de faire un retour à la ligne à cet endroit. Par exemple, en bon français, on met une espace insécable avant des « : », et ainsi ceux-ci se trouvent attachés avec le mot juste avant et ne peuvent pas se retrouver en début de ligne. Je vous conseille la lecture de l'article wikipédia sur ce sujet si vous souhaitez en savoir plus.
En pratique, il est facile d'en mettre dans du HTML : c'est la fameuse entité
(pour non-breaking space). Les traitements de texte savent aussi
les insérer au bon endroit pour vous. Et il est possible d'en insérer
manuellement avec une combinaison du clavier, qui dépend du système
d'exploitation et de la disposition du clavier. Sous GNU/Linux, la combinaison
souvent utilisée pour ça est Alt gr
+ espace
. Ainsi, lorsque l'on est en
train de taper une suite de commandes avec des pipes, on peut se retrouver
très facilement avec une espace insécable si on a le malheur de garder le
doigt appuyé sur la touche Alt gr
un poil trop longtemps. On se retrouve
alors avec un message qui a de quoi laisser perplexe :
% ls | grep foo
command not found: grep
Je me suis fait avoir un paquet de fois, jusqu'à désactiver la saisie des
espaces insécables en ajoutant cette ligne au fichier ~/.xmodmaprc
:
keycode 65 = space space space space space
Ça suffit pour éviter que je ne saisisse des espaces insécables, mais je me suis alors rendu compte que d'autres développeurs pouvaient eux aussi saisir des espaces insécables dans du code. J'ai donc configuré mon éditeur, vim, pour afficher les espaces insécables :
set listchars=trail:◃,nbsp:•
set list
Et malgré ça, je me suis encore laissé avoir. J'ai récupéré un fichier CSV
avec des villes, avec diverses informations sur chaque ville dont la
population. J'importe les données et je me rends alors compte que Bordeaux
fait 448 habitants. Un rapide coup d'oeil au fichier CSV avec less
et je
découvre que des espaces sont utilisées comme séparateur des milliers pour la
population. Je remplace alors mon code par :
population = row.last.gsub(/\s/, '').to_i
Ça supprime les espaces, tabulations et retours à la ligne avant de convertir
en entier. Confiant, je relance mon script et, surprise, ça ne marche toujours
pas ! J'ai fait un petit tour des erreurs classiques : vérifier que j'ai bien
la bonne valeur dans row.last
, bien vider la base de données avant de
réessayer, etc. Rien n'y fait. Je lance un interpréteur Ruby et je tape :
"448 144".gsub(/\s/, '').to_i
# => 448144
Ça devrait bien marcher, et pourtant ça ne marche pas. Alors, vous avez deviné d'où venait le problème ? Le séparateur des milliers n'était pas une simple espace mais une espace insécable… Une fois la source trouvée, la correction fut simple :
population = row.last.gsub(/[[:blank:]]/, '').to_i
Mais, amis codeurs, méfiez-vous des espaces insécables !