Pourtant j'ai bon caractère ...

Résolu
danielos77 Messages postés 108 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je souhaitais utiliser dans un code pour uploader des fichiers la fonction sur les chaines de caractères (https://www.php.net/manual/fr/function.strtr.php) avec le passage suivant pour nettoyer le nom des fichiers.

// Formate le nom du fichier en remplaçant les caractères accentués.
        $filename = strtr($filename, 
              'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 
              'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
        // En remplaçant les caractères autres que l'alphabet par des tirets A FAIRE PLUS TARD   
//        $filename = preg_replace('#([^.a-z0-9]+)#i', '-',  $filename);

Au départ, j'ai un nom de fichier qui est Hà_â_é_è_ê_ö_nri.pdf et à l'arrivée j'ai Hyy_y�_y�_y�_y�_y�_nri.pdf.
Le 'à' est devenu 'yy' et tous les autres caractères accentués des 'y�'.

Pourtant, dans la partie head HTML du formulaire, j'ai bien une balise <meta charset="UTF-8">. et pour être sûr que dans le php j'ai aussi de l'utf-8, j'ai mis la ligne : utf8_encode ($filename); avant les lignes pour remplacer les caractères accentués.
Mais cela est sans effet.
Au début, j'ai pensé que c'était juste l'encodage du texte à l'affichage sur mon écran ... mais le fichier est bien enregistré avec ces caractères chez l'hébergeur.

Je viens, par acquis de confiance, de faire des echo juste avant et juste après la fonction, et j'ai bien "Hà_â_é_è_ê_ö_nri.pdf" avant et "Hyy_y�_y�_y�_y�_y�_nri.pdf" après. Je ne pense pas que redonner au string de sortie le même nom que celui de l'entrée soit en cause. Et je fais confiance à cette fonction issue du manuel.

La gestion des erreurs , débogage et écriture du code php que j'ai bien lu ne m'aide guère sur ce coup là.

A la limite, c'est pas dramatique, je peux laisser les caractères accentués ;-(

Daniel


Configuration: Windows / Firefox 75.0 / PHP 7.2.24


--
A voir également:

3 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour, cela ne fonctionne pas bien avec UTF-8, qui utilise plusieurs octets par caractères.

as-tu essayé ainsi:
$table = array(
        'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',
        'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
        'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
        'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
        'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
        'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
        'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
        'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r',
    );
    strtr($string, $table);
1
danielos77 Messages postés 108 Date d'inscription   Statut Membre Dernière intervention   2
 
Bonjour yg_be,
Non, j'ai pas essayé avec un tableau. Je vais tester.
Merci
Daniel
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
c'est d'ailleurs expliqué dans la page dont tu donnes le lien: https://www.php.net/manual/fr/function.strtr.php#111270
0
danielos77 Messages postés 108 Date d'inscription   Statut Membre Dernière intervention   2 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui mais j'étais parti sur la fonction avec 3 éléments, et je ne savais pas que les caractères utf-8 faisaient plus d'un octet avec les exemples donnés, 1 lettre = 1 octet... mais non.
Merci encore.
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Lorsque l'on a des soucis d'encodage ( utf8), il faut commencer par vérifier que tout est conforme (aussi bien au niveau de l'encodage du fichier lui même... que dans la chaine de connexion à la bdd et le charset défini sur les pages.)
Tout est expliqué ici :
https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8

.
1
danielos77 Messages postés 108 Date d'inscription   Statut Membre Dernière intervention   2
 
Bonjour Jordane45,
Mon encode du fichier est bien en UTF-8 (c'est écrit en gros en haut dans le bandeau).
Pour développer la partie du script, j'ai mis en commentaire toutes les connexions à la bdd et les fonctions mail().
Pour la Bdd, j'ai juste déclaré une variable fixe dans la page qui envoie le _GET.
La déclaration de l'encodage dans les pages est fait.
L'instruction 'utf8_encode ($filename);' a été mise ne commentaire après avoir vu que ça ne fonctionnait pas.
Je pense donc que les prérogatives 'Html/Php -caractères accentués et l'UTF8' sont bien suivies de ce côté.
Cordialement,
Daniel


--
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Tu ne bosserai pas en local sur ton ordi par hasard ? un windows ?
Regarde ceci : https://blog.garr.co.uk/php/2015/09/22/php-windows-and-utf-8-filenames.html
0
danielos77 Messages postés 108 Date d'inscription   Statut Membre Dernière intervention   2 > jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention  
 
Non, je suis directement sur le site de l'hébergeur.
Mais merci pour ce lien, je vais le lire (ou du moins essayer de comprendre les grandes lignes car mon anglais date d'il y a 50 ans environ.
Sinon, la solution de yg_be fonctionne (je viens de tester). Il aurait fallu savoir que les caractère UTF-8 >1octet et donc passer par la fonction en 2 éléments.
Je vais passer la discussion en résolu.
Merci encore surtout pour les connaissances apportées et les progrès que vous me faites faire.
Daniel
0