af83

Les espaces insécables pour les codeurs

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 grun 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 !

blog comments powered by Disqus