Aller au contenu

Lettres accentuées dans noms de fichiers et BDD MySql


nabuchodonosor
 Share

Messages recommandés

Bonjour,

Poster un sujet est mon dernier espoir ... Pas trouvé de réponses sur le net après une matinée de recherche.

Petit Papa Noel m'a apporté un Mac Book Pro OS X Mountain Lion. Je migre mes sites sur Apache et php livré avec.

Mes scripts php marchent bien sous Linux (hébergeur OVH) et sous Windows (le vieil ordi).

Voilà le pb : un répertoire contient des fichiers textes de chansons, les noms de fichiers (le titre de la chanson) contiennent des accents, des apostrophes et toutes les horreurs possibles.

A chaque fichier j'attache une ligne d'une table BDD Mysql. Le titre de la chanson est l'un des champs (codé utf8-general-ci).

Il s'agit à partir du nom de fichier, lu par scandir dans le répertoire, de retrouver la ligne de la table mysql, en php.

Eh bin, çà marche pas dès qu'un accent apparait.

La page html générée est codée en utf8 : <meta http-equiv="content-type" content="text/html; charset=utf8">

Mais la requete : 'SELECT * FROM '.T_CHANTS.' WHERE titre = "'.$t[$i].'"' où $t[$i] est un titre lu par scandir m'envoie promener. (pas de résultat)

Tous les utf8_encode ou decode, les htmlentities, les iconv("macroman", ...), tout essayé, rien à faire ...

Quelqu'un a-t-il une idée ???

S'il vous plait : au secours, je me noie ....

Lien vers le commentaire
Partager sur d’autres sites

le fichiers texte des chansons sont écrit avec quel encodage de texte ?

il ne suffit pas de mettre "utf-8", il faut aussi que le fichier à lire le soit :-)

 

oups, et bienvenue sur Macfr au passage ! :anniversaire:

Lien vers le commentaire
Partager sur d’autres sites

Et selon la version de PHP/MySQL, on peut être amené à envoyer une déclaration d'encodage à la base MySQL (je ne le faisait pas sur FREE et j'ai été obligé de le faire sur Hostinger).

 

 

$link1 = mysql_connect('localhost','user1','pass1',TRUE);

mysql_selectdb('db1',$link);

mysql_set_charset('utf8',$link); 

 

Bienvenue itou :)

Modifié par BorakLeRouge
Lien vers le commentaire
Partager sur d’autres sites

le fichiers texte des chansons sont écrit avec quel encodage de texte ?

il ne suffit pas de mettre "utf-8", il faut aussi que le fichier à lire le soit :-)

 

oups, et bienvenue sur Macfr au passage ! :anniversaire:

 

Les fichiers textes eux-memes sont en utf8 mais je n'en suis pas à les lire, seulement à tripoter les titres utilisés en noms de fichiers.

Lien vers le commentaire
Partager sur d’autres sites

Et selon la version de PHP/MySQL, on peut être amené à envoyer une déclaration d'encodage à la base MySQL (je ne le faisait pas sur FREE et j'ai été obligé de le faire sur Hostinger).

 

 

$link1 = mysql_connect('localhost','user1','pass1',TRUE);

mysql_selectdb('db1',$link);

mysql_set_charset('utf8',$link); 

 

Bienvenue itou :)

 

Marche pas, ni ISO-8859-1, ni macroman à la place de utf8 dans le set_charset.

J'ai bien peur d'avoir à traduire la base de données. Pour l'instant elles sont identiques localement et en ligne, et recopiées par import / export.

C'est vraiment la barbe ces histoires de pages d'encodage des accents.

Les pauvres qui travaillent en caractères chinois ou hébreux !!!

Merci quand même.

Lien vers le commentaire
Partager sur d’autres sites

pour info, je bosse depuis des années en utf-8 et je n'ai jamais eu aucun souci, y compris pour des caractères à la noix (tchèque, norvégien, etc).

perso, je regarderai mieux du coté de ta fonction de scandir (d'ailleurs pas sûr que ce soit la bonne fonction php pour le coup), et voir d'y rajouter, ici, un utf8_encode (ou decode, je teste souvent les deux si ca foire).

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, le pb vient peut-être de scandir. Si tu affiches les noms de fichiers directement dans php. Ca sort normal ou foireux ?

Lien vers le commentaire
Partager sur d’autres sites

pour info, je bosse depuis des années en utf-8 et je n'ai jamais eu aucun souci, y compris pour des caractères à la noix (tchèque, norvégien, etc).

perso, je regarderai mieux du coté de ta fonction de scandir (d'ailleurs pas sûr que ce soit la bonne fonction php pour le coup), et voir d'y rajouter, ici, un utf8_encode (ou decode, je teste souvent les deux si ca foire).

 

J'imagine également que çà vient de scandir. Quelle autre donction utiliser ? Je cherche ça en tout cas.

 

Effectivement, le pb vient peut-être de scandir. Si tu affiches les noms de fichiers directement dans php. Ca sort normal ou foireux ?

 

Je suis d'accord pour mettre en cause scandir. Que veux-tu dire par "afficher les noms de fichiers directement, c'est ça que je cherche à faire. Bon je cherche autour de scandir. Quelle autre fonction utiliserais-tu ?

En tout cas merci de l'idée. Je cherche.

Lien vers le commentaire
Partager sur d’autres sites

pour tester si c'est le scandir qui manche pas :

<?php
print_r(scandir('/le/chemin/vers/le/dossier'));
?>

 

pour une autre fonction équivalente a scandir :

<?php
function load($dir='')
{
$dos_resource = opendir($dir);
$fichiers = array();
while (false !== ($filename = readdir($dos_resource)))//On lis le dossier
{
$fichiers[] = pathinfo($filename, PATHINFO_FILENAME);
}
closedir($dos_resource);
return $fichier;
}
print_r(scandir('/le/chemin/vers/le/dossier'));
?>

 

De mon coté j'ai tester scandir et ma fonction, sur MAMP et avec php de Mac OS X (Terminal) : les deux marchent bien.

Mais j'ai testé que sur un ordi (10.6.8) et sur un disque (HFS+)

Modifié par FJA
Lien vers le commentaire
Partager sur d’autres sites

J'imagine également que çà vient de scandir. Quelle autre donction utiliser ? Je cherche ça en tout cas.

 

 

 

Je suis d'accord pour mettre en cause scandir. Que veux-tu dire par "afficher les noms de fichiers directement, c'est ça que je cherche à faire. Bon je cherche autour de scandir. Quelle autre fonction utiliserais-tu ?

En tout cas merci de l'idée. Je cherche.

 

Le listing du répertoire avec readdir est bon, les accents sortent bien dans les titres. Ca sort normal. Mais pas la recherche dans la table. La requete est :

$requete= 'SELECT * FROM '.T_CHANTS.' WHERE titre = "'.$t.'"';

Et aucun utf8-encode, decode ou autre conv ne convient.

Lien vers le commentaire
Partager sur d’autres sites

pour tester si c'est le scandir qui manche pas :

<?php
print_r(scandir('/le/chemin/vers/le/dossier'));
?>

 

pour une autre fonction équivalente a scandir :

<?php
function load($dir='')
{
$dos_resource = opendir($dir);
$fichiers = array();
while (false !== ($filename = readdir($dos_resource)))//On lis le dossier
{
$fichiers[] = pathinfo($filename, PATHINFO_FILENAME);
}
closedir($dos_resource);
return $fichier;
}
print_r(scandir('/le/chemin/vers/le/dossier'));
?>

 

De mon coté j'ai tester scandir et ma fonction, sur MAMP et avec php de Mac OS X (Terminal) : les deux marchent bien.

Mais j'ai testé que sur un ordi (10.6.8) et sur un disque (HFS+)

La fonction load que tu me proposes donne un listing correct des titres (je faisais l'équivalent de mon côté) C'est bien la requete qui foire.

(PS j'ai ajouté un s au dernier $fichierS du return de la fonction)

Lien vers le commentaire
Partager sur d’autres sites

Bon j'abandonne : je crée un champ supplémentaire dans la table avec le titre sans accents. J'enlève les accents avec un truc du genre : iconv("utf-8", "iso-8859-1//IGNORE", $t) . En espérant que deux titres ne se distinguent pas seulement par des lettres accentuées. !!!!

Lien vers le commentaire
Partager sur d’autres sites

Sinon, en plus d'utiliser mysql_set_charset, tu es sûr que la colonne de ta table qui contiens les fameux nom de fichier est en UTF-8 ?

 

Une de mes table qui gère des textes en UTF-8 est configuré comme ça :

phpadmin.png

 

Sinon pour gérer des liens fichiers base de donnée, j'utiliserais plutôt des SHA1 ou quelque chose comme ça, quitte à stocker les nom d'origine (si besoin est pour l'utilisateur) dans la base.

Lien vers le commentaire
Partager sur d’autres sites

Sinon, en plus d'utiliser mysql_set_charset, tu es sûr que la colonne de ta table qui contiens les fameux nom de fichier est en UTF-8 ?

 

Une de mes table qui gère des textes en UTF-8 est configuré comme ça :

post-27-0-20690200-1358099217_thumb.png

 

Sinon pour gérer des liens fichiers <-> base de donnée, j'utiliserais plutôt des SHA1 ou quelque chose comme ça, quitte à stocker les nom d'origine (si besoin est pour l'utilisateur) dans la base.

Oui bien sur les champs sont bien paramétrés utf8_general_ci.

J'ai inspecté à fond le php.ini qui a bien un charset ="utf-8"

si le texte qui contient l'accent est fourni en littéral dans le script php, il est correctement stocké, s'il est lu, par php, dans un fichier texte, ça va aussi, il n'y a que s'il se trouve dans un nom de fichier lu par scandir ou readdir qu'il est stocké de façon stupide dans la table.

le caractère é devient eI (la deuxième lettre est un i majuscule accent grave). Le code Hexa 8E semble celui du Mac Roman.

J'ai vu sur un forum que le Java de Mountain Lion n'a toujours pas l'utf8 en charset par défaut, mais utilise le MacRoman; y-a-t-il du Java sous jacent à Apache, Php ou Mysql ?

En tout cas merci.

Le pire est que même une mesure de contournement (supprimer les lettres accentuées avec iconv et //IGNORE ) n'est pas compatible avec UNIX ni Windows :

croisée devient croisee avec le Mac et croise (un seul e) avec les autres.

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Share

×
×
  • Créer...