web-dev-qa-db-fra.com

Quelle est la différence entre iconv () et mb_convert_encoding () en PHP?

Quelle est la différence entre iconv() et mb_convert_encoding() en PHP? Est-ce que l'on fonctionne mieux, plus rapidement, etc. (par exemple avec des encodages spécifiques)? Dans quelles situations serait-on préféré à l'autre?

Voici ce que je pense savoir déjà:

iconv ()

  1. inclus avec la plupart des installations de PHP.
  2. lorsque des caractères qui ne peuvent pas être mappés au nouveau jeu de caractères sont trouvés, vous pouvez spécifier s'ils sont convertis en caractères "similaires" ou ignorés.

mb_convert_encoding ()

  1. nécessite généralement l'installation de l'extension php-mbstring.
  2. est capable de gérer HTML-ENTITIES, conversion vers et depuis les codes hexadécimaux Web.

Y a-t-il d'autres différences?

55
T. Brian Jones

iconv() est juste un wrapper autour de la fonction iconv() trouvée dans la bibliothèque système C où PHP est en cours d'exécution (à moins que PHP soit construit avec GNU iconv, auquel cas GNU iconv est utilisé). Ainsi, les performances et les fonctionnalités de iconv() dépendent de l'endroit où vous exécutez PHP et de la façon dont il est construit.

L'implémentation de mb_convert_encoding(), d'autre part, est incluse dans la source PHP (module). Il comprend une bibliothèque appelée libmbfl qui gère la conversion réelle. Ainsi, cela fonctionne de la même manière, peu importe où vous exécutez PHP. Il y a une liste des encodages pris en charge ici: http://php.net/manual/en/mbstring.encodings.php

Donc, en résumé, je suppose que vous pourriez dire que mb_convert_encoding() est plus fiable à utiliser si vous souhaitez prendre en charge différentes plates-formes. Cependant, si vous utilisez iconv() sur Linux (par exemple), il prend en charge beaucoup plus d'encodages (voir iconv --list).

La performance relative des fonctions dépend également de l'implémentation spécifique de iconv(), évidemment.

28
pelle

Depuis PHP 5.4 il y a un bug. Parfois, iconv renvoie une chaîne nulle au lieu de renvoyer une chaîne avec un caractère "similaire".

Vous devez donc utiliser mb_convert_encoding.

2
webshaker