JavaScript8 min de lecture

encodeURIComponent vs encodeURI : quand utiliser l'un ou l'autre

Une comparaison détaillée des fonctions JavaScript encodeURIComponent() et encodeURI(), avec des exemples et les bonnes pratiques.

Les deux fonctions JavaScript d'encodage d'URL

JavaScript propose deux fonctions intégrées pour l'encodage d'URL : encodeURI() et encodeURIComponent(). Bien qu'elles puissent sembler similaires, utiliser la mauvaise peut entraîner des URL cassées, des failles de sécurité ou une corruption de données. Comprendre la différence est essentiel pour les développeurs web.

encodeURI() - Pour les URI complètes

encodeURI() est conçue pour encoder une URI complète. Elle encode tous les caractères, sauf ceux qui ont une signification particulière dans la structure d'une URI. Plus précisément, elle n'encode PAS :

  • Les caractères réservés : ; , / ? : @ & = + $ #
  • Les caractères non réservés : lettres, chiffres, - _ . ! ~ * ' ( )
// encodeURI préserve la structure de l'URI
encodeURI('https://example.com/path?q=hello world&lang=en')
// "https://example.com/path?q=hello%20world&lang=en"
// Remarque : :, /, ?, =, & ne sont PAS encodés

encodeURIComponent() - Pour les composants d'URI

encodeURIComponent() est conçue pour encoder un seul composant d'une URI (comme la valeur d'un paramètre de requête). Elle encode TOUS les caractères, sauf :

  • Les caractères non réservés : lettres, chiffres, - _ . ! ~ * ' ( )
// encodeURIComponent encode tout, sauf les caractères non réservés
encodeURIComponent('hello world & goodbye')
// "hello%20world%20%26%20goodbye"
// Remarque : & EST encodé car c'est un caractère réservé

// Utilisation pour la valeur d'un paramètre de requête
const url = 'https://example.com/search?q=' +
  encodeURIComponent('cats & dogs');
// "https://example.com/search?q=cats%20%26%20dogs"

Erreurs courantes

Erreur n° 1 : utiliser encodeURI pour des valeurs de requête

Si vous utilisez encodeURI() pour encoder la valeur d'un paramètre de requête contenant une esperluette, celle-ci ne sera pas encodée et sera interprétée comme un séparateur de paramètres, ce qui casse votre URL.

// INCORRECT : l'esperluette dans la valeur casse l'URL
const badUrl = 'https://api.example.com/search?q=' +
  encodeURI('Tom & Jerry');
// "https://api.example.com/search?q=Tom%20&%20Jerry"
// Le serveur voit : q="Tom " et un paramètre " Jerry" sans valeur

// CORRECT : utilisez encodeURIComponent
const goodUrl = 'https://api.example.com/search?q=' +
  encodeURIComponent('Tom & Jerry');
// "https://api.example.com/search?q=Tom%20%26%20Jerry"
// Le serveur voit correctement : q="Tom & Jerry"

Erreur n° 2 : utiliser encodeURIComponent pour des URL complètes

Si vous utilisez encodeURIComponent() sur une URL entière, elle encodera les deux-points, les barres obliques, les points d'interrogation et les autres caractères structurels, rendant l'URL totalement inutilisable.

Quand utiliser l'un ou l'autre : la règle simple

  • Utilisez encodeURI() lorsque vous avez une URI complète qui peut contenir des espaces ou des caractères non-ASCII, mais dont la structure est valide.
  • Utilisez encodeURIComponent() lorsque vous encodez une seule donnée destinée à être insérée dans une URI (valeurs de paramètres de requête, segments de chemin, etc.).

L'alternative URLSearchParams

Le JavaScript moderne propose l'API URLSearchParams, qui gère l'encodage automatiquement. C'est souvent la meilleure approche pour construire des chaînes de requête :

const params = new URLSearchParams({
  q: 'Tom & Jerry',
  category: 'cartoons & animation',
  page: '1'
});

const url = 'https://example.com/search?' + params.toString();
// "https://example.com/search?q=Tom+%26+Jerry&category=cartoons+%26+animation&page=1"

// Ou utilisez l'API URL
const url2 = new URL('https://example.com/search');
url2.searchParams.set('q', 'Tom & Jerry');
console.log(url2.toString());

Articles connexes

Essayez nos outils gratuits