Bonjour,

Je suis en train de préparer un site en multilingue. J'ai donc conçu ma base en utf-8 afin de pouvoir supporter d'autres charset que l'europe occidentale.

Pour insérer les données, j'utilise pour l'nstant directement PHPMyAdmin (2.8.2.1).
Après insertion, les accents et caractères spéciaux européens apparaissent correctement dans PHPMyAdmin, tandis que les caractères asiatiques sont codés ( & # 3 5 7 8 0 ; )

Le problème se pose à l'affichage de la page HTML (déclarée en utf-8). Les caractères spéciaux sont remplacés par des ? mais les caractères asiatiques apparaissent convenablement.

J'ai du mal à comprendre où est le problème...
:o(

J'ai cherché à pas mal d'endroits, mais j'ai pas vraiment trouvé de docs accessibles qui me conviennent : trop de paramètres entrent en compte et je suis perdu : la déclaration des charsets de la page, de la table, des interclassements, de la base, de MySQL, et puis les versions de PHPMyAdmin, de MySQL...

Bref : Smiley bawling
yakou32 a écrit :
Après insertion, les accents et caractères spéciaux européens apparaissent correctement dans PHPMyAdmin, tandis que les caractères asiatiques sont codés ( & # 3 5 7 8 0 ; )

Le problème se pose à l'affichage de la page HTML (déclarée en utf-8). Les caractères spéciaux sont remplacés par des ? mais les caractères asiatiques apparaissent convenablement.


Cela signifie que les "caractères spéciaux" ne sont pas encodés en utf-8, mais probablement en iso.

Quant aux caractères saisis sous la forme d'entités numériques (&#...), ils seront affichés correctement quelque-soit le charset du document et de la base, les entités étant indépendantes des jeux de caractères (sous réserve que l'utilisateur ait une police unicode adaptée, bien-sûr).
Modifié par Laurent Denis (13 Aug 2006 - 14:08)
Si je comprends bien, cela veut dire qu'un élément est resté en iso quelque part.

Effectivement, en affichant les variables de réglage du serveur (que je découvre pour l'occasion), je constate que son charset est latin1.

En cherchant parmi les sujets, j'ai tenté la requète SET CHARACTER SET 'utf-8'; directement dans la boîte de dialogue SQL de PHP MyAdmin (j'imagine que cette requète s'effectue directement comme ça ?)

Seulement, MySql répond que ce charset est inconnu.

Effectivement, en revenant aux variables de réglage du serveur, utf-8 ne semble pas disponible :
character sets : latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis dec8 dos german1 hp8 koi8_ru latin2 swe7 usa7 cp1251 danish hebrew win1251 estonia hungarian koi8_ukr win1251ukr greek win1250 croat cp1257 latin5

Suis-je donc coincé ?
Modifié par yakou32 (13 Aug 2006 - 14:47)
Merci Mathieu, la fonction htmlentities() résoud mon problème originel d'accents.
Néanmoins, cela en pose un autre car les caractères accentués ne sont pas les seuls traités : dans ma base de données, tous les articles n'ont pas exactement le même format de contenus ; certains contiennent des listes, d'autres des sauts de lignes, des liens, etc... Un peu de code HTML est donc présent dans le contenu de la BDD.
Or, la fonction htmlentities() traduit littéralement tous les caractères spéciaux, les accents donc, mais aussi les <> des balises html. Au final, tous les caractères spéciaux s'affichent convenablement, mais le code HTML apparait sans être interprété...

Existe t-il une fonction équivalente à htmlentities n'affectant pas les <> et permettant ainsi l'interprétation des balises html ?
J'ai essayé autre chose :

Plutôt que d'inscrire le contenu directement dans PHPMyAdmin, j'ai essayé de passer par un formulaire d'insertion de l'interface d'administration du site Internet. Cette page est donc déclarée en utf-8.

Cette fois-ci, dans la base de données, les balises sont conservées,tandis que les caractères accentués passent sous la forme de deux caractères ( é ).

Il suffirait que la page interprète convenablement ces caractères pour résoudre le problème...
Salut

Je ne sais pas si ça a un rapport, mais quel est le jeu de caractères utilisé par MySQL ? Et celui de ta base de données ?
a écrit :
Existe t-il une fonction équivalente à htmlentities n'affectant pas les <> et permettant ainsi l'interprétation des balises html ?


Je ne connais pas de fonction équivalente. (Cela ne veut pas dire qu'elle n'existe pas)

La seule solution que j'entrevois est de remplacer tous les caractères qui pausent problèmes via str_replace().

Mais j'espère qu'il existe une solution plus performante...
Modifié par Mathieu_vd (16 Aug 2006 - 12:07)
Une autre solution serait de prévoir une interface d'encodage d'article où tout élément HTML serait supprimé. (et les caractères spéciaux convertis)
Par contre, des balises "maisons" serait permise et transformée en balises html.
Exactement comme pour ce forume où par exemple:
[ quote]texte[/ quote] devient <blockquote>texte</blockquote>

Modifié par Mathieu_vd (16 Aug 2006 - 16:59)
@ Matthieu_vd : c'est un peu se prendre la tête pour pas grand chose ! Je suis sûr et certain qu'il est possible de stocker des caractères accentués dans une base de données MySQL. C'est probablement un problème de configuration ou une incompatibilité d'encodage à un niveau ou l'autre ...

@ yakou32 : tu devrais essayer de poser aussi ta question sur un forum généraliste ou plus orienté PHP, on ne sait jamais Smiley cligne
Bon, alors finalement, ça fonctionne !

Les textes de contenus contiennent donc des balises HTML, des caractères accentués européens, ou asiatiques.

La solution est assez simple à gérer :

Une page d'insertion/mise à jour, où l'on colle les caractères étrangers avec le code HTML
Et la page d'affichage avec une requète directe depuis la base de données sans traitement.

Le seul endroit où c'est illisible, c'est dans la BDD, mais c'est un moindre mal, la gestion nécessitera de passer par l'interface admin du site Internet.

Hypothèse d'explication :
La page d'insertion en utf-8 envoie le code utf-8 à la BDD, qui le comprend tant bien que mal en 2 caractères au lieu d'un (en ISO donc ?).
Lors de la requète, la BDD renvoie les deux caractères, qui sont réinterprétés en utf-8 pas la page d'affichage.
Sopo a écrit :

Je ne sais pas si ça a un rapport, mais quel est le jeu de caractères utilisé par MySQL ? Et celui de ta base de données ?


C'est vrai que l'idéal serait d'avoir les caractères en clair dans PhpMyAdmin.
Comme tu as pu le constater, je ne suis pas très familier de l'utilisation des charsets dans cette application.

J'ai construit la structure de la base en local, que j'ai exportée ensuite en distant. Pour les données, j'ai inséré directement dans la base distante.

PhpMyadmin en local est la version 2.6.1, qui fonctionne sur MySQL 4.1.9.
Cette version de PHPMyAdmin m'a permis de configurer la structure en utf-8. Les valeurs pour la session y sont utf-8 en client, connection, results, system, et latin1 en database, server.

En distant, j'ai PHPMyAdmin 2.8.2.1 et MySQL 4.0.25. Mais là je n'ai plus accès à la configuration des charsets des tables Smiley decu . Et comme je le disais plus haut, MySQL est en ISO, et j'ai pas réussi à le changer, car utf-8 ne fait pas partie des choix possibles. Et là j'ai un seul charset global de configurable.

Moi je suis un peu perdu là-dedans...
a écrit :
Moi je suis un peu perdu là-dedans...


Je te rassures, tu n'es pas le seul Smiley lol

Mais bon, le principal, c'est que l'affichage sur ta page soit correct.
Bonjour,
J'ai un peu le même problème sauf que lorsque j'affiche les données sur un autre page, l'accentuation est correcte.
Je m'explique,
J'ai repris un site qui utilisait déjà les inclusions de BDD dans un processus de souscription. (Pas de problèmes d'accents)
Comme ce site a une partie chinoise, j'ai décidé de passer tous les fichiers au format UTF 8 (Bloc note / Enregistrer sous / codage : UTF8 à la place de ANSI)
Or quand je reprend les mêmes éléments de ma BDD que pour la souscription, les problèmes d'accents apparaissent avec des ? à la place.
J'ai bien tenté de tout reconvertir en Latin-1 pour la bdd et ANSI pour les fichiers mais rien n'y fait.
Smiley fache
En tous cas je continue de chercher parceque pour moi le problème vient du fichier appelant.
Je vous tient au courant.
Réponse trouvée (pour mon cas en tous cas)
Lorsque je déclare la page
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Au lieu de charset=utf-8, Les accents s'affichent correctement.
Maintenat le problème vient que je voulais passer en utf-8 pour les charactères chinois.
Devrais je passer tous mes champs de bdd en langage html pour la prise en compte des accents ?*
Existe t il une méthode pour qu'un formulaire enregistre directement en format html dans la bdd ?
Bonne journée,
J'ai écrit une fonction js qui me sert pour coder en UTF-8 :

function convertHTMLEntities(string)
	{
	for(var i=0; i<string.length; i++)
		{
		if(string.charCodeAt(i)>127)
			{
			string=string.replace(new RegExp(string.charAt(i), "g"), "&#" + string.charCodeAt(i) + ";");
			}
		}
	return string;
	}