Pourtant j'ai bon caractère ...

Résolu/Fermé
danielos77 Messages postés 108 Date d'inscription samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 - 24 avril 2020 à 12:01
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 - 24 avril 2020 à 16:06
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 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
24 avril 2020 à 12:12
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 samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
24 avril 2020 à 12:15
Bonjour yg_be,
Non, j'ai pas essayé avec un tableau. Je vais tester.
Merci
Daniel
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
24 avril 2020 à 12:15
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 samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
24 avril 2020 à 12:40
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 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
24 avril 2020 à 14:02
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 samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2
24 avril 2020 à 14:16
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 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
24 avril 2020 à 14:49
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 samedi 18 février 2006 Statut Membre Dernière intervention 16 janvier 2024 2 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
24 avril 2020 à 15:01
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