Conservation des accents des répertoires

Conservation des accents des répertoires - PHP - Programmation

Marsh Posté le 26-10-2017 à 13:45:45    

Bonjour,
 
  Mon serveur apache est sous windows.
  J'ai une arborescence avec des noms de répertoires contenant des accents.
  Je liste mon arborescence avec un script encoder en UTF8 sans BOM et j'inserts les noms (réencodé en utf8) dans une table et champ encodés en utf8_bin (moteur MYISAM).

Code :
  1. // Ca ressemble à cela
  2. foreach (glob("*" ) as $e) {
  3.   exe(INSERT INTO rep VALUES('"'.utf8_encode($r).'"'));
  4. }


  Normalement dans ma table j'ai de l'utf8, non ?
 
  Ensuite j'ai un autre script encoder en UTF8 sans BOM ou je fait une requête qui liste mes répertoires que j'affiche dans mon navigateur.
  Je suis obligé de reconvertir mon nom (utf8_encode($r)) pour avoir mes accents sinon j'ai des '?' à la place, est-ce normal ?
 
Merci par avance.

Reply

Marsh Posté le 26-10-2017 à 13:45:45   

Reply

Marsh Posté le 26-10-2017 à 17:03:01    

Quelle version de PHP ?
 
Depuis PHP 7.1.0, PHP utilisant l'API Unicode de Windows au lieu d'ANSI, les renvoie en UTF-8 (par défaut, c'est éventuellement "configurable" ).
 
Antérieur, utilisant l'API ANSI, tous les noms de fichier renvoyés (et à utiliser) sont et doivent être encodés en ANSI (CP1252 pour nous).
 
Du coup :

  • pour PHP >= 7.1.0, rien à faire normalement, rien à convertir (= supprimer utf8_encode) mais ta connexion doit être en UTF-8 (charset=utf8 dans le DSN)
  • pour PHP < 7.1.0, deux solutions :

1. sois tu convertis toi-même les noms de CP1252 à UTF-8 avec iconv (à préférer à utf8_encode qui effectue une conversion ISO-8859-1 => UTF-8 qui te ferait perdre des caractères comme € ou oe) pour une connexion PDO/MySQL en utf8 (charset=utf8 dans le DSN)
2. tu ne convertis rien, c'est-à-dire que tu restes en CP1252 en mettant ta connexion PDO/MySQL dans le même jeu (charset=latin1 dans le DSN)
 
Quoi qu'il arrive, au SELECT, tu ne devrais rien avoir à faire (mis à part préciser le jeu de caractères de la connexion, chose qui devrait être déjà faite).
 
Il serait bon aussi d'ajouter un échappement de $r (qui sort de nulle part - $e ?) voire carrément mieux, d'opter pour une requête préparée.
 
PS : si ton code n'est pas en PDO, il faut faire l'équivalent de ce paramètre charset (mysqli_set_charset, ou son équivalent OO - pour mysqli)
PPS : il vaudrait mieux éviter MyISAM (pas de clés étrangères, ça peut crasher, etc)


Message édité par pluj le 26-10-2017 à 17:21:14
Reply

Marsh Posté le 27-10-2017 à 09:57:45    

Merci je vais étudier cela.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed