Aller au contenu


Photo

Lettres accentuées dans noms de fichiers et BDD MySql

UTF8 Mysql Mac OS X Maountain

  • Please log in to reply
13 replies to this topic

#1 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 11 janvier 2013 - 15:34

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 ....

#2 Amarok II

Amarok II

    NeoAdmin

  • Administrateurs
  • PipPipPipPipPipPip
  • 1 469 Messages :
  • Configuration:Un petit truc en alu avec un grand rectangle lumineux qui affiche des choses qui bougent quand je chatouille un autre truc en alu, là... tout plat.
  • Sexe:Mystère
  • Localisation:Perpignan, France
  • Passions:MacFr bien sûr !

Posté 11 janvier 2013 - 16:12

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:

MacBook Pro (13", fin 2012)
8Go RAM - 256Go SSD - 1To HD

Technicien certifié ACMT et plein d'autres trucs...

"On peut voir de bien des façons. On peut être aveugle de bien des façons." (Frank Herbert, Dune)

"Tu ne feras point de machine à l'esprit de l'homme semblable." (Frank Herbert, Dune)


#3 BorakLeRouge

BorakLeRouge

    Hamster d'or (dort ?)

  • Membres
  • PipPipPipPipPipPipPip
  • 3 950 Messages :
  • Configuration:Mac Mini Core i7 - 16Go - 2To Hybride
  • Sexe:Masculin
  • Localisation:Cormeilles en Parisis.rb
  • Passions:Macintosh, Photo, Haute-fidélité, Ski, Roller, Call of Duty, Tactical Ops, Counter Strike, Worms 1

Posté 11 janvier 2013 - 16:39

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 :)

Ce message a été modifié par BorakLeRouge - 11 janvier 2013 - 16:40 .

Je fais mes sauvegardes sur NSA-Cloud !

Au bout de 10 ans, le vieux MacPro vient de laisser sa place à un MacMini i7...


#4 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 11 janvier 2013 - 18:01

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.

#5 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 11 janvier 2013 - 18:22

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.

#6 Amarok II

Amarok II

    NeoAdmin

  • Administrateurs
  • PipPipPipPipPipPip
  • 1 469 Messages :
  • Configuration:Un petit truc en alu avec un grand rectangle lumineux qui affiche des choses qui bougent quand je chatouille un autre truc en alu, là... tout plat.
  • Sexe:Mystère
  • Localisation:Perpignan, France
  • Passions:MacFr bien sûr !

Posté 11 janvier 2013 - 19:29

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).

MacBook Pro (13", fin 2012)
8Go RAM - 256Go SSD - 1To HD

Technicien certifié ACMT et plein d'autres trucs...

"On peut voir de bien des façons. On peut être aveugle de bien des façons." (Frank Herbert, Dune)

"Tu ne feras point de machine à l'esprit de l'homme semblable." (Frank Herbert, Dune)


#7 BorakLeRouge

BorakLeRouge

    Hamster d'or (dort ?)

  • Membres
  • PipPipPipPipPipPipPip
  • 3 950 Messages :
  • Configuration:Mac Mini Core i7 - 16Go - 2To Hybride
  • Sexe:Masculin
  • Localisation:Cormeilles en Parisis.rb
  • Passions:Macintosh, Photo, Haute-fidélité, Ski, Roller, Call of Duty, Tactical Ops, Counter Strike, Worms 1

Posté 11 janvier 2013 - 21:38

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

Je fais mes sauvegardes sur NSA-Cloud !

Au bout de 10 ans, le vieux MacPro vient de laisser sa place à un MacMini i7...


#8 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 12 janvier 2013 - 17:34

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.

#9 FJA

FJA

    Maniaque du clavier

  • Membres
  • PipPipPipPip
  • 565 Messages :
  • Configuration:iMac [iMac5,1 (Intel Core 2 Duo)]
    MBA [MacBookAir4,2 (i5, 13,3")]
  • Sexe:Masculin
  • Localisation:Lille

Posté 12 janvier 2013 - 17:53

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+)

Ce message a été modifié par FJA - 12 janvier 2013 - 17:54 .



#10 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 12 janvier 2013 - 18:00

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.

#11 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 12 janvier 2013 - 18:11

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)

#12 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 12 janvier 2013 - 18:24

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. !!!!

#13 jp

jp

    Touriste

  • Modérateurs
  • PipPipPipPipPipPipPipPipPip
  • 6 564 Messages :
  • Configuration:N/A
  • Sexe:Masculin
  • Localisation:Créteil

Posté 13 janvier 2013 - 19:49

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 :
Fichier joint  phpadmin.png   100,7 Ko   9 Nombre de téléchargements 

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.
La phrase suivante est fausse. La phrase précédente est vraie.

#14 nabuchodonosor

nabuchodonosor

    Membre

  • Membres
  • Pip
  • 8 Messages :
  • Configuration:MacBook Pro OS X mountain lion
  • Sexe:Masculin
  • Localisation:France
  • Passions:php, mysql, chant liturgique,

Posté 14 janvier 2013 - 18:05

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 :
Fichier joint  phpadmin.png   100,7 Ko   9 Nombre de téléchargements 

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.




1 utilisateur(s) en train de lire ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)