Boucle sur table non spip et charset

Salut,

j'ai un souci de charset lorsque je fais une boucle sur une table sql non spip.
J'utilise SPIP 1.9.2e.

C'est on ne peut plus simple dans le squelette:
<BOUCLE_specialites(CONSULT_SPECIALITES) {par nom} {publique=1}>
    <li><a href="#">#NOM</a></li>
</BOUCLE_specialites>

La base mysql SPIP est en latin1 (SHOW CREATE TABLE montre toujours latin1). Ma
table perso est aussi en latin1.

Au niveau html c'est de l'utf8 (et le meta tag est bien là).

Mais y'a rien à faire les données qui sorte de ma table arrive en latin1 dans le
navigateur. J'ai converti ma table en utf8 (ALTER TABLE .. CONVERT TO CHARACTER
SET..), ça change rien, le texte venant de ma table est toujours en latin1.

Pourtant les données spipiennes (articles, etc...) s'affiche bien en utf8 dans
le navigateur.

Ma base SQL est à priori propre (je n'ai pas mis un charset dans un autre),
lorsque je fais un mysqldump les caractères accentués sortent nickel pour ma
table comme pour les tables spip.

Un conseil ?

--
  Olivier Guilyardi / Samalyse

Le 28 novembre 2008 03:24, Olivier Guilyardi a écrit :

Salut,

j'ai un souci de charset lorsque je fais une boucle sur une table sql non spip.
J'utilise SPIP 1.9.2e.

....

Mais y'a rien à faire les données qui sorte de ma table arrive en latin1 dans le
navigateur. J'ai converti ma table en utf8 (ALTER TABLE .. CONVERT TO CHARACTER
SET..), ça change rien, le texte venant de ma table est toujours en latin1.

Pourtant les données spipiennes (articles, etc...) s'affiche bien en utf8 dans
le navigateur.

Ma base SQL est à priori propre (je n'ai pas mis un charset dans un autre),
lorsque je fais un mysqldump les caractères accentués sortent nickel pour ma
table comme pour les tables spip.

Il te faut peut-être tout simplement vider les caches : spip, navigateur

--
@plus

Hiện nay, Jacques ở Hà Nội

Pour les lyonnais++ spip-lyon@rezo.net http://spip-party.net/-Lyon-

Jacques J. wrote:

Le 28 novembre 2008 03:24, Olivier Guilyardi a écrit :

Salut,

j'ai un souci de charset lorsque je fais une boucle sur une table sql non spip.
J'utilise SPIP 1.9.2e.

....

Mais y'a rien à faire les données qui sorte de ma table arrive en latin1 dans le
navigateur. J'ai converti ma table en utf8 (ALTER TABLE .. CONVERT TO CHARACTER
SET..), ça change rien, le texte venant de ma table est toujours en latin1.

Pourtant les données spipiennes (articles, etc...) s'affiche bien en utf8 dans
le navigateur.

Ma base SQL est à priori propre (je n'ai pas mis un charset dans un autre),
lorsque je fais un mysqldump les caractères accentués sortent nickel pour ma
table comme pour les tables spip.

Il te faut peut-être tout simplement vider les caches : spip, navigateur

J'ai fais ça, ça ne change rien. Pour spip, j'ai simplement fais config/vider le
cache dans l'espace privé. Y'a-t-il quelque chose de plus radical ?

Si je fais un SET NAMES 'utf8' juste avant la boucle ça résout le problème pour
les données qui viennent de ma table (mais ça casse les données qui proviennent
de boucles spip situées après). De toute façon c'est trop hackish à mon gout.

Je ne suis visiblement pas le premier à qui ça arrive (voir dernier post):
http://forum.spip.org/fr_564.html

Mon premier diagnostic est le suivant (à vérifier) :

- le charset client de mysql est latin1, si bien que les données récupérées par
les appels mysql sont toujours en latin1, que la table sous-jacente soit en utf8
ou en latin1 (mysql convertit automatiquement les données vers le charset client).

- spip convertit automatiquement les données de latin1 vers utf8 pour *ses*
tables, mais n'applique pas ce traitement aux tables non spip. En conséquence de
quoi, il faut mettre utf8 pour le charset du client mysql avant de travailler
avec ces dernières, ce qui rend la conversion de charset réalisée par spip inutile.

Pour que je puisse mieux vérifer ça, est-ce que l'un de vous pourrait m'indiquer
où se situe la conversion de charset dans le core, et notamment pour les tables
non spip ?

--
  Olivier Guilyardi / Samalyse

mets ça dans ta balise utf8_encode

exemple :

[(#TOPIC_TITLE|utf8_encode)]

Cordialement,

Le 28 novembre 2008 11:42, Olivier Guilyardi <ml@xung.org> a écrit :

Jacques J. wrote:

Le 28 novembre 2008 03:24, Olivier Guilyardi a écrit :

Salut,

j’ai un souci de charset lorsque je fais une boucle sur une table sql non spip.
J’utilise SPIP 1.9.2e.

Mais y’a rien à faire les données qui sorte de ma table arrive en latin1 dans le
navigateur. J’ai converti ma table en utf8 (ALTER TABLE … CONVERT TO CHARACTER
SET…), ça change rien, le texte venant de ma table est toujours en latin1.

Pourtant les données spipiennes (articles, etc…) s’affiche bien en utf8 dans
le navigateur.

Ma base SQL est à priori propre (je n’ai pas mis un charset dans un autre),
lorsque je fais un mysqldump les caractères accentués sortent nickel pour ma
table comme pour les tables spip.

Il te faut peut-être tout simplement vider les caches : spip, navigateur

J’ai fais ça, ça ne change rien. Pour spip, j’ai simplement fais config/vider le
cache dans l’espace privé. Y’a-t-il quelque chose de plus radical ?

Si je fais un SET NAMES ‹ utf8 › juste avant la boucle ça résout le problème pour
les données qui viennent de ma table (mais ça casse les données qui proviennent
de boucles spip situées après). De toute façon c’est trop hackish à mon gout.

Je ne suis visiblement pas le premier à qui ça arrive (voir dernier post):
http://forum.spip.org/fr_564.html

Mon premier diagnostic est le suivant (à vérifier) :

  • le charset client de mysql est latin1, si bien que les données récupérées par
    les appels mysql sont toujours en latin1, que la table sous-jacente soit en utf8
    ou en latin1 (mysql convertit automatiquement les données vers le charset client).

  • spip convertit automatiquement les données de latin1 vers utf8 pour ses
    tables, mais n’applique pas ce traitement aux tables non spip. En conséquence de
    quoi, il faut mettre utf8 pour le charset du client mysql avant de travailler
    avec ces dernières, ce qui rend la conversion de charset réalisée par spip inutile.

Pour que je puisse mieux vérifer ça, est-ce que l’un de vous pourrait m’indiquer
où se situe la conversion de charset dans le core, et notamment pour les tables
non spip ?


Olivier Guilyardi / Samalyse


liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

irc://irc.freenode.net/spip ou http://embed.mibbit.com/?server=irc.freenode.net&channel=%23spip


Yohann, Admin de la Chambre des Secrets - www.chambredesecrets.net
La Chambre des Secrets - Le meilleur de l’actualité Harry Potter !

Frédéric Barboteu wrote

J'ai eu récemment un problème apparenté, et si je l'ai résolu dans mon
cas, je n'en ai pas tiré de ceritudes absolues et générales.

Manifestement, ça reste la bouteille à l'encre, avec plein de
témoignages amenant des tentatives d'explication finalement contradictoires.
Le vrai problème est qu'on ne dispose (à ma connaissance) d'aucune
référence officielle, énamant de l'équipe de développement de Spip,
quant à la stratégie retenue en la matière.

Je donne donc ici ma propre vision des choses, en insistant bien sur le
fait que ça ne prétend pas à l'universalité.

    Est-ce que l'un de vous pourrait m'indiquer où se situe la
    conversion de charset dans le core ?

En l'état de mes investigations, il me semble que Spip ne cherche
aucunement à se préoccuper d'adapter sa façon d'échanger les données
avec MySql (ni dans ses propres tables, ni dans les autres).

En effet, premier point : il n'y a pas le moindre "SET NAMES" dans le code.
J'avais cru pouvoir en déduire que Spip prenait les données comme elles
viennent, pour ensuite convertir celles qui le nécessitent, au cas par
cas pour chaque champ chaîne reçu.

Mais, deuxième point : je n'ai pas davantage réussi à trouver où sont
utilisées les fonctions figurant dans charset.php, et de toutes façons
des essais montrent clairement qu'en fait les données sont affichées par
Spip telles qu'il les a reçues.

Mes tests contredisent ce dernier point, voir plus bas.

Mon interprétation : Spip se base simplement sur le fait qu'a priori les
données qu'il lit sont toujours des données qu'il a écrites (le
contenu affiché dans l'espace public provient de ce qui a été saisi à
travers l'espace privé).
Autrement dit, peu lui importe qu'entre deux (à l'intérieur de la base),
les données effectives ne correspondent pas au codage qu'elles sont
censées avoir : l'oubli de conversion en écriture est exactement
compensé par l'oubli de reconversion en lecture.

    Lorsque je fais un mysqldump les caractères accentués sortent nickel
    pour ma table comme pour les tables spip

Pour moi, le "juge de paix" pour vérifier la réalité du contenu, c'est
la lecture directe par phpMyAdmin : je parierais que, dans ton cas,
l'affichage de la table spip_articles montre bel et bien des signes
exotiques à la place des caractères accentués.
C'est-à-dire que les champs, réputés être en latin1, contiennent en
réalité de l'utf8.
Et que par contre, le même phpMyAdmin affiche un contenu correct pour la
table non-Spip.
(j'admets que c'est bizarre par rapport à la constation en mysqldump,
mais là je sèche...)

Je vois très bien de quoi tu parles, je connais ce problème de charset dans
charset. Après tout ça n'est qu'une suite d'octets, et il m'est déjà arrivé par
erreur de coder de l'utf8 dans du latin1, etc...

Mais mes juge de paix à moi c'est les outils en ligne de commande mysql et
mysqldump :stuck_out_tongue: Il faut quand même voir qu'ils font partie de la distrib officielle
de MySQL, c'est les outils de référence.

Et non, le corps des articles de spip est correctement encodé. Bon, il y a
effectivement une erreur pour les données de spip_articles.titre, là l'encoding
est cassé (et pourtant ils s'affichent correctement..). Mais pour tout le reste
les données sont en latin1 dans des tables latin1 avec un charset client par
défaut en latin1. Et pourtant spip parle en utf8 avec le navigateur.

Effectivement je n'ai pas vu de SET NAMES ou similaire dans le log de mysqld,
donc il y a forcément une conversion qui est opérée par spip. Je me demande si
ça serait pas au niveau des balises #TITRE, #TEXTE, etc... en provenance des
tables spip.

    Si je fais un SET NAMES 'utf8' juste avant la boucle ça résout le
    problème pour
    les données qui viennent de ma table (mais ça casse les données qui
    proviennent
    de boucles spip situées après). De toute façon c'est trop hackish à
    mon gout.

Pour que ça marche totalement, il faut en plus du "SET NAMES 'utf8'"
avant la boucle, rajouter un "SET NAMES DEFAULT" après la boucle (bien
sûr, ça ne colle pas s'il faut traiter aussi des données Spip à
l'intérieur de la même boucle... là, faudrait creuser un peu plus...).
Pour moi, c'est bien ça la bonne solution.

Je fais un SET NAMES 'latin1' arpès la boucle, le "DEFAULT" est pas mal aussi...

Quant à être "trop hackish", je vois la chose différemment : en l'état
de cette absence de certitudes générales que j'évoquais plus haut, cette
façon de faire est la moins invasive qui soit.
Très ponctuelle, très visiblement attachée au problème qu'elle cerne,
facile à remettre en cause ultérieurement si l'on acquiert une meilleure
compréhension...

Oui, mais après tout dépend de ton degré et de ta perception de la hackitude :wink:

Moi, j'aime pas ces #EVAL qu'il faut copier dans tous les templates où je
manipule l'une ou l'autre de mes tables (il y en a 4).

Je vais essayer de trouver un truc plus clean.

En tout cas, ça m'a l'air de bug(s) tout ça.

Merci pour ta réponse détaillée

--
  Olivier Guilyardi / Samalyse

Yohann Prigent wrote:

mets ça dans ta balise utf8_encode

exemple :

[(#TOPIC_TITLE|utf8_encode)]

Merci, comme je n'ai pas beaucoup de champs dans mes tables, ça me semble une
solution de contournement plus acceptable que le SET NAMES. A première vu ça a
l'air plus lourd, mais je suppose qu'avec le cache ça n'a pas d'incidence, ça
fait même deux requêtes en moins. Et c'est assez explicite.

--
  Olivier Guilyardi / Samalyse

personnellement c’est ce que j’utilise, et comme en plus je ne comprends vraiment rien aux encodages, c’est bien mieux ^^

Le 28 novembre 2008 16:13, Olivier Guilyardi <ml@xung.org> a écrit :

Yohann Prigent wrote:

mets ça dans ta balise utf8_encode

exemple :

[(#TOPIC_TITLE|utf8_encode)]

Merci, comme je n’ai pas beaucoup de champs dans mes tables, ça me semble une
solution de contournement plus acceptable que le SET NAMES. A première vu ça a
l’air plus lourd, mais je suppose qu’avec le cache ça n’a pas d’incidence, ça
fait même deux requêtes en moins. Et c’est assez explicite.


Olivier Guilyardi / Samalyse


Yohann, Admin de la Chambre des Secrets - www.chambredesecrets.net
La Chambre des Secrets - Le meilleur de l’actualité Harry Potter !

Bonjour,

Je suis assez nouveau sur spip mais je suis sur que l'objet de ma question
doit etre une evidence pour bcp d'entre vous.

Sur mon projet en cours, un site de peintre, les actualites sont entrees en
tant que breve dans la rubrique actualites.

Selon que l'actu est un vernissage ou une expo, on attribue le mot cle expo
ou vernissage a la breve.

En page d'accueil, une extraction de ces breves est realisee montrant le
titre et un bout de descriptif.
Ces actus de page d'accueil sont presentes en 3 sous sections, "A venir",
"En cours", et "recemment passés".

Je voudrais que pour un vernissage par exemple, la breve de ce vernissage
passe en "recemment passé" (ou disparaisse de l'acceuil) des que la date du
vernissage est dépassée.

J'ai entre apercu plusieurs contribs et commentaires sur le sujet mais qui
n'ont pas l'air d'etre adaptees à mon souhait. L'idee au final est que
l'artiste qui rentrera ses actus puisse faire ca de facon tres simple depuis
la redaction de sa breve idealement.

J'espere etre assez explicite, desole de ne pas donner de lien, tout est
encore en dvpt en local.

Merci d'avance pour vos conseils precieux.

Paul

-----Message d'origine-----
De : spip-bounces@rezo.net [mailto:spip-bounces@rezo.net] De la part de
Olivier Guilyardi
Envoyé : vendredi 28 novembre 2008 16:14
À : Yohann Prigent
Cc : spip@rezo.net
Objet : Re: [Spip] Boucle sur table non spip et charset

Yohann Prigent wrote:

mets ça dans ta balise utf8_encode

exemple :

[(#TOPIC_TITLE|utf8_encode)]

Merci, comme je n'ai pas beaucoup de champs dans mes tables, ça me semble
une
solution de contournement plus acceptable que le SET NAMES. A première vu ça
a
l'air plus lourd, mais je suppose qu'avec le cache ça n'a pas d'incidence,
ça
fait même deux requêtes en moins. Et c'est assez explicite.

--
  Olivier Guilyardi / Samalyse
_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net

Infos et archives : http://listes.rezo.net/mailman/listinfo/spip

Documentation de SPIP : http://www.spip.net/

irc://irc.freenode.net/spip ou
http://embed.mibbit.com/?server=irc.freenode.net&channel=%23spip

luapmada a écrit :

Bonjour,

Je suis assez nouveau sur spip (...)

Il vaut mieux créer un nouveau message pour une nouvelle question. En répondant à un message même si tu as changé le sujet, tu te retrouves dans le fil du message que tu as repris.

Je voudrais que pour un vernissage par exemple, la breve de ce vernissage
passe en "recemment passé" (ou disparaisse de l'acceuil) des que la date du
vernissage est dépassée.

Sur l'un de mes sites, j'utilise la date de publication de la brève comme date de l'évènement (facilement mis en place par le rédacteur) et le critère {age<=0} dans la boucle breves élimine les brèves dont la date est dépassée.

Eric

Olivier Guilyardi a écrit :

Yohann Prigent wrote:

mets ça dans ta balise utf8_encode

exemple :

[(#TOPIC_TITLE|utf8_encode)]

Merci, comme je n'ai pas beaucoup de champs dans mes tables, ça me semble une
solution de contournement plus acceptable que le SET NAMES. A première vu ça a
l'air plus lourd, mais je suppose qu'avec le cache ça n'a pas d'incidence, ça
fait même deux requêtes en moins. Et c'est assez explicite.

Aprés tu peux peut être le spécifier dans $table_des_traitements
et ce sera(it) alors fait de manière transparente.

JLuc

JLuc wrote:

Olivier Guilyardi a écrit :

Yohann Prigent wrote:

mets ça dans ta balise utf8_encode

exemple :

[(#TOPIC_TITLE|utf8_encode)]

Merci, comme je n'ai pas beaucoup de champs dans mes tables, ça me
semble une
solution de contournement plus acceptable que le SET NAMES. A première
vu ça a
l'air plus lourd, mais je suppose qu'avec le cache ça n'a pas
d'incidence, ça
fait même deux requêtes en moins. Et c'est assez explicite.

Aprés tu peux peut être le spécifier dans $table_des_traitements
et ce sera(it) alors fait de manière transparente.

Effectivement, en mettant la ligne suivante dans le fichier options de mon
plugin, utf8_encode() est appelée automatiquement pour le champ nom de la table
consult_specialites :

$table_des_traitements['NOM']['consult_specialites'] = 'utf8_encode(%s)';

Merci !

--
  Olivier Guilyardi / Samalyse