|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 238 ![]() |
Bonjour,
Après des heures et des heures de recherches, je capitule et décide d’appeler à l’aide. Voilà : J’ai un module php/mysql full UTF8 : j’entends par là : fichier encodé en utf-8, un header('Content-Type: text/html; charset=utf-8'); au début de chaque page, etc, etc. Bref, tout se passe bien. Je stocke dans la base ce que j’ai à l’écran. Les caractères chinois sont stockés en chinois, le russe en russe, etc. Maintenant, j’ai un formulaire que je dois non seulement enregistrer dans ma base mais aussi dans une base mysql tiers. Et là, je sèche. Je rencontre un problème de conversion. Je n’arrive pas à enregistrer dans une base non utf8 des datas qui le sont. Code :
Paris é 巴黎 La base2 stocke Paris é ?? Le résultat devrait être : J'ai testé plusieurs traitements avec sans utf8_decode(), etc. rien n'y fait. Si on regarde le code du formulaire initial rattachée à la base 2, on constate les points suivants : <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> Et pour le reste, rien de spécial : <input type="text" name="name" value="<? print($nom); ?>" size="50" maxlength="100"> Le code de mise à jour dans la base2 est classique, pas de traitement particulier des $_POST. La table qui reçoit les data utilise un Interclassement latin1_swedish_ci En vous remerciant par avance, Tavar
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant. |
||
|
|
00
|
|
|
#2 |
|
En attente de confirmation mail
![]() Inscription : juin 2002 Messages : 6 164 ![]() |
- ucwords, strtolower* sont incompatibles avec de l'UTF-8
- iso-8859-1 n'existe pas comme nom de jeu pour MySQL, c'est latin1 - le jeu à indiquer au niveau de MySQL c'est celui de vos données/requêtes pas des colonnes puisque MySQL les connait et se charge des conversions si nécessaire (du moins, je ne considère ici que la partie qui nous intéresse, character_set_client) - convertir de l'UTF-8 dans un jeu beaucoup plus limité comme l'est l'ISO-8859-1, n'a aucun sens. D'ailleurs utf8_decode ne fonctionnera pas : les caractères chinois devraient être substitués par des points d'interrogation (puisque non retranscriptibles/inexistants en ISO-8859-1). Par contre, le remplacement de tels caractères en entités XML/HTML (leur point de code) est une mauvaise idée (meilleur moyen d'avoir des recherches incohérentes et interopérabilité nulle, entre autres). Si malgré tout vous n'avez la possibilité d'insister pour une migration en UTF-8, il y a $out = mb_convert_encoding($in, 'HTML-ENTITIES', 'UTF-8') qui convertit également les caractères latin1 (sinon, a priori, l'écrire soi-même ou le plus proche est de passer par PHP 5.4/Transliterator - $out = transliterator_create('[^\x00-\x7F\xC0-\xFF]-Hex/XML10')->transliterate($in)). * du moins sans mbstring.func_overload & 2 et mbstring.internal_encoding = UTF-8 PS : les balises code/codeinline du code PHP ont reconvertis les caractères en entités |
|
|
10
|
|
|
#3 | ||
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 238 ![]() |
Bonsoir julp,
Merci pour vos éléments de réponse. Maintenant plusieurs remarques. Citation:
Citation:
Si vous aviez une idée de code, je suis preneur !
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant. |
||
|
|
00
|
|
|
#4 | ||
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 238 ![]() |
Bonsoir,
Merci , ou plutôt, un Grand merci à vous julp. Finalement, je vais utilisé Code :
), j'ai refait plusieurs tests. Le fait de convertir en HTML-ENTITIES n'a pas d'incidence sur l'application tiers. L'affichage web est correcte et c'est le principal.Chose curieuse et que je n'arrive pas à m'expliquer : si je saisi dans le module de mise à jour de l'application (que je ne gère pas) : Paris é 巴黎 à € on stocke dans la base : avec mb_convert_encoding($in, 'HTML-ENTITIES', 'UTF-8') on obtient (logiquement ): Code :
Paris é 巴黎 à € Je n'ai pas réussi à tester Code :
$out = transliterator_create('[^\x00-\x7F\xC0-\xFF]-Hex/XML10')->transliterate($in) Bien à vous tavar
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant. |
||
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : septembre 2010 Messages : 7 219 ![]() |
si dans ton formulaire tu mets : Paris é 巴黎 à €
dans ta base tu dois avoir : Paris é 巴黎 à € dans ton HTML : Paris é 巴黎 à € niveau visuel : Paris é 巴黎 à € mysql_real_escape_string pour la base htmlspecialschars pour l'affichage et c'est tout, y'a rien a encoder, convertir, translitérer ...
__________________
http://blog.stealth35.com/ |
|
|
01
|
|
|
#6 |
|
En attente de confirmation mail
![]() Inscription : juin 2002 Messages : 6 164 ![]() |
J'ai compris que :
Par conséquent, c'est impossible sans "htmlentitiesation" (avec ce que ça implique et tout) :
Les rédacteurs de dvp sont dans une situation similaire d'ailleurs ... |
|
|
10
|
|
|
#7 |
|
Membre du Club
![]() Inscription : janvier 2007 Messages : 238 ![]() |
Bonjour,
Concernant les remarques de stealth35: Je rappelle que je dois enregistrer la même données dans 2 bases de données paramétrées différemment. Dans ma base je suis full UTF-8, donc RAS. C'est par rapport à l'autre base que je n'arrive pas à enregistrer exactement comme le module de mise à jour rattaché à l'autre base le fait. Si je tape Paris 巴黎 , j'enregistre, on obtient sur les pages web qui s’appuient sur l'autre base de données: Paris 巴黎. La solution proposée par julp répond au besoin. Certes, en "htmlentitiesant", cela n'aide pas pour les recherches, mais l'autre application n'en a pas besoin vraiment. L'autre base de données sert finalement que pour afficher des noms sur des pages web. En revanche mon application couvre plusieurs domaines et là RAS nous sommes en utf-8. Donc je vais clôturer ce post en vous remerciant encore une fois et plus particulièrement julp pour la qualité des ses remarques. Bien à vous Tavar
__________________
Mieux vaut penser avant d'agir que d'agir en rêvant. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com