Caractères spéciaux et scandir entre LAMP et WAMP

Avatar du membre
Eléphant du PHP | 224 Messages

03 févr. 2021, 00:56

Couin Couiiiiiinnnn !!!!

Bon, je sèche encore une fois (vais finir en poudre à force ... ).

Un script me permettant de lister l'arborescence de là où je place le fichier du script en question.
Je développe sur WAMP et envoie sur un serveur LAMP qui sert en interne au boulote.

Pour exposer le problème, j'ai fais une version minimaliste :

Code : Tout sélectionner

<html lang="fr"> <head> <title>ScanDir</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <body> <? $fichiers = scandir('./'); natcasesort($fichiers); foreach($fichiers as $fichier) { echo $fichier . "<br>"; } ?> </body> </html>
Avec les noms de fichiers contenants des accents, j'ai un souci :

Sur LAMP, le résutlat est conforme :
.
..
FR_instructions mise à jour FW_QC.doc
Hey patron, j'me suis trompé d'morceau.wav
index.php
Préselection-Fabien-3.xls
Mais sur WAMP, le résultat n’est pas bon :
.
..
FR_instructions mise � jour FW_QC.doc
Hey patron, j'me suis tromp� d'morceau.wav
index.php
Pr�selection-Fabien-3.xls
J'ai essayé avec utf8_encode sur l'echo $fichier, résultat :

WAMP oki :
.
..
FR_instructions mise à jour FW_QC.doc
Hey patron, j'me suis trompé d'morceau.wav
index.php
Préselection-Fabien-3.xls
Mais LAMP plus oki :
.
..
FR_instructions mise à jour FW_QC.doc
Hey patron, j'me suis trompé d'morceau.wav
index.php
Préselection-Fabien-3.xls
J'ai beau testé plein de trucs (changer le charset dans la balise meta, mettre un header dans la partie php, etc etc), quand c'est bon sur un c'est plus bon sur l'autre :tir2:

Mon fichier est fait sous Notepad++ en UTF-8 (et non UTF8-BOM).

Alors certes, LAMP comme WAMP sont vieux (php 5.3.10 pour LAMP et php 5.3.13 pour WAMP) mais pas du tout au gout du jour de tout refaire en version récente (avec php7.x par exemple) car j'ai plein de script qui ne tourneraient plus (car en mysql et non mysqli), mais bon, il y a 10 ans, ces versions php était récentes et le problème aurait été le même.

Qui qu'aurait une idée pour le canard ? :oops:

Merkouin !
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Mammouth du PHP | 1564 Messages

07 févr. 2021, 06:41

Si c'est juste pour "echo" traduit les caractères en entités HTML avec htmlentities()

Avatar du membre
Eléphant du PHP | 224 Messages

08 févr. 2021, 02:06

Coucoutte :)

Merci pour cette réponse.
Je testerais ca au boulote, mais il me semble que j’avais déjà testé.

A suivre donc :)
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Mammouth du PHP | 1564 Messages

08 févr. 2021, 11:28

ta pas déclaré le doctype de ta page:

Code : Tout sélectionner

<!DOCTYPE html>
Puis en utilisant le doctype HTML5, tu peux déclarer ton charset comme suit:

Code : Tout sélectionner

<meta charset="utf-8">
Juste après l'ouverture de la balise <head>

Avatar du membre
Eléphant du PHP | 224 Messages

08 févr. 2021, 20:42

Plop !

Bon, malgré les modification, ce n'est pas mieux :(

Le code modifié :

Code : Tout sélectionner

<!DOCTYPE html> <html lang="fr"> <head> <title>ScanD</title> <meta charset="UTF-8" /> <body> <? $fichiers = scandir('./'); natcasesort($fichiers); foreach($fichiers as $fichier) { echo "SANS HTMLENTITIES : " . $fichier . "<br>"; echo "AVEC HTMLENTITIES : " . htmlentities($fichier) . "<br>"; }?> </body> </html>
Résultat sur le serveur linux LAMP :
SANS HTMLENTITIES : Hey patron, j'me suis trompé d'morceau_2.wav
AVEC HTMLENTITIES : Hey patron, j'me suis trompé d'morceau_2.wav
Résultat sur le serveur windows WAMP :
SANS HTMLENTITIES : Hey patron, j'me suis tromp� d'morceau_2.wav
AVEC HTMLENTITIES : Hey patron, j'me suis trompé d'morceau_2.wav


Ouiiiiinnnnnn lol
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Mammouth du PHP | 1564 Messages

08 févr. 2021, 21:25

htmlentities peut prendre des paramètres, regarde la doc et tente d’utiliser l'"UTF-8"

essaye: htmlentities($chaine,ENT_QUOTES,"UTF-8");

https://www.php.net/manual/fr/function.htmlentities.php

Avatar du membre
Eléphant du PHP | 224 Messages

08 févr. 2021, 22:26

Reu !

Bon bah j'ai essayé plusieurs combinaisons mais toujours pas de résultat :( Un coup rien ne s'affiche sur WAMP, un coup les caractères accentués disparus :(
WAMP m'avait déjà posé des soucis (mysqldump par exemple) du coup ça en fait un de plus, de souci lol
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Mammouth du PHP | 1564 Messages

08 févr. 2021, 23:09

tu fais une condition: si tu es sur linux tu fait en sorte d'utiliser la méthode qui fonctionne sur linux, sinon l'autre

Avatar du membre
Eléphant du PHP | 224 Messages

09 févr. 2021, 04:41

Oui c'est sur mais pour quand c'est une ligne ça va mais quand c’est pour plusieurs pages ça peut vite alourdir le truc :(
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Mammouth du PHP | 1564 Messages

09 févr. 2021, 09:02

Solutions possibles:

1. Linux et Windows ne gère pas identiquement les caractères accentués (à confirmer) pour afficher une chaine avec les accents convertis, tu peux utiliser la fonction remplacerAccent() que tu trouvera sur cette page: https://www.c2script.com/scripts/conver ... g-s18.html

2. Et dans tous les cas, on évite d'avoir des accents et même des guillemets dans un titre. :non:

3. Mettre à jour WAMP et LAMP

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 févr. 2021, 09:53

Le problème que tu rencontres vient du fait que tes deux serveurs utilisent un jeu de caractères différents.
Ton serveur Linux te renvoie des noms de fichiers en utf8, alors que ton serveur Windows te les renvoie en ISO-8859-1 ou en CP-1252.

Essaye peut-être de détecter cela avec la fonction mb_detect_encoding();
var_dump(mb_detect_encoding($string, 'UTF-8, CP-1252, ISO-8859-1'));
Et en fonction du résultat tu fais ta conversion ou pas...
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 224 Messages

12 févr. 2021, 03:35

Plop !

Ah bah vais tester ça tout à l'heure au boulote lol

Merkouin !
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen: