2010-08-24 4 views
1

Je dois comparer les chaînes et faire correspondre les noms les uns aux autres même s'ils ne sont pas orthographiés de la même manière. Par exemple DÉSIRÉ-Smith doit correspondre Desireesmith ainsi que Désirée ou Desi'ree Smithiconv utf-8 à ascii translittération dans mod_php/apache2

donc j'ai eu l'approch suivant qui fonctionnait parfaitement dans la ligne de commande en utilisant PHP-CLI:

<? 
    class Alike { 
     static function convertAlike($string) { 
     // in case the first and last name or two first names are mixed up 
     $parts = preg_split('/[\s\-\.\_]/', $string, -1, PREG_SPLIT_NO_EMPTY); 
     sort($parts); 
     $string = implode($parts); 

     $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); // transliterate 
     $string = strtolower($string); // lowercase 
     $string = preg_replace('/[^a-z]/','',$string); // remove everything but a-z 
     $string = preg_replace('{(.)\1+}','$1',$string); // remove duplicate chars 
     return $string; 
     } 
     static function compareAlike($string1,$string2) { 
     return (strcmp(Alike::convertAlike($string1),Alike::convertAlike($string2)) === 0) ? true : false; 
     } 
    } 
    echo Alike::convertAlike("DÉSIRÉ-Smith").PHP_EOL; // desiresmith 
    echo Alike::convertAlike("Desireesmith").PHP_EOL; // desiresmith 
    echo Alike::convertAlike("Desi'ree Smith").PHP_EOL; // desiresmith 
    echo Alike::convertAlike("René Röyßeå likes special characters ½ € in ©").PHP_EOL; // reneroysealikespecialcharacterseurinc 

    var_dump(Alike::compareAlike("DÉSIRÉ-Smith","Desireesmith")); // true 
    var_dump(Alike::compareAlike("Desireesmith","Desi'ree Smith")); // true 
    var_dump(Alike::compareAlike("summer","winter")); // false 
    ?> 

Cependant, dans mon site en cours d'exécution Server version: Apache/2.2.14 (Ubuntu) en cours d'exécution PHP Version 5.3.2-1ubuntu4.2 En tant que module, je reçois toujours des signes de question. Le plus drôle est que l'erreur doit occour dans cette ligne

$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); // transliterate 

parce qu'après je peux voir tous les caractères qui n'a pas été transcrite, mais ceux qui auraient dû être remplacés par ascii caractères deviennent des signes d'interrogation.

J'ai essayé toutes les combinaisons possibles de codage de chaîne d'entrée/sortie et de réglages d'icône interne, d'entrée et de sortie d'iconv ainsi que les paramètres régionaux. J'ai même fait chmod -R 777/usr/lib/gconv et déplacé le à mon répertoire de travail.

cependant j'ai vu ce bug a rapporté en Ontario, il liste de diffusion: http://bugs.php.net/bug.php?id=44096

[2010-06-07 21:22 UTC] icovt at yahoo dot com 
mod_php iconv() is not working properly if your apache is chrooted and you do not 
have the content of /usr/lib/gconv/ folder into your relative chroot path (i.e. 
/your/chroot/path/usr/lib/gconv/). 
You can simply do: 
cp /usr/lib/gconv/* /your/chroot/path/usr/lib/gconv/ 
... and re-try. 

This was a fix for me, hope this could save time for somebody else. 

P.S. Btw, initially iconv() called from command line (using php cli) was OK. 

J'ai essayé que mon utilisateur www-data est à la maison dans/var/www/et j'ai fini avec le dossier/var/www/usr/lib/gconv/ainsi que/var/www/myproject/usr/lib/gconv/

FYI: j'avais des fonctions de détection et de transcodage de codage pour assurer le passage correct des encodages, mais les supprimer par souci de clarté car ils ne sont pas nécessaires anwyay si vous entrez des chaînes utf8 tout devrait être bien ...

Des idées?

Répondre

2

compris que les paramètres régionaux n'étaient pas configurés correctement et que mes tentatives pour le définir échouaient car les locales disponibles sur le système étaient en réalité différentes des exemples de pages de manuel (selon leur encodage!) un simple locale -a a révélé que: O

setlocale(LC_ALL, "en_US.utf8"); 

cela a effectivement fait le travail!

maintenant cette fonction fonctionne parfaitement.

maintenant, il est également clair pourquoi cela a fonctionné à partir de la console, car les paramètres régionaux ont été importés à partir des paramètres du shell des utilisateurs actuels;) , il a juste besoin de paramètres régionaux. Peu importe qui convertit en ascii où tout le monde est égal, seulement certains sont plus égaux que d'autres :)

Soyez prudent de définir une locale qui est réellement installé dans votre système et vérifiez le résultat de setlocale, parce que vous ne changera rien si les paramètres régionaux ne sont pas installés ou si le nom est mal orthographié.

Questions connexes