Problème d'interaction UTF-8 (forcé dans php.ini) et latin1
Posté : 21 oct. 2007, 10:16
Bonjour,
J'ai décidé de laisser un message ici après plusieurs heures à farfouiller un peu partout.
Mon serveur force l'utilisation de l'UTF-8 dans php.ini. Ici apparemment, ça pose problème.
Voici ma source (en partie) :
Alors, je vous explique ma démarche :
Il y a un document XML que je dois parser, il n'y a pas de souci à ce niveau. Je le fais avec simpleXML.
Les entrées "literal" sont des caractères japonais encodées en UTF-8. Apparemment, il y a un souci quand l'UTF-8 est forcé, soit disant il part du principe que l'encodage de base est latin1 (cp1252) et du coup, il encode une seconde fois en UTF-8, ce qui donne un résultat incorrect.
Voici plus de détail sur le problème :
http://dev.mysql.com/doc/refman/5.1/en/ ... -sets.html
Ils indiquent de faire un dump mais moi je ne veux pas faire ça ! Je veux convertir à la volée et injecter l'enregistrement dans la BDD.
Je suis sur que c'est trois fois rien à faire, mais j'en ai un peu marre. Merci de m'accorder un peu de votre temps !
J'ai décidé de laisser un message ici après plusieurs heures à farfouiller un peu partout.
Mon serveur force l'utilisation de l'UTF-8 dans php.ini. Ici apparemment, ça pose problème.
Voici ma source (en partie) :
if (isset($_GET['step']) && $_GET['step'] == 1)
{
$time_start = microtime(true);
$i = 0;
echo '<p>Insertion des <i>Kanji</i><br />';
foreach ($xml->character as $char)
{
$i++;
$literal = $char->literal;
//$literal = utf8_to_html($char->literal);
//$literal = mb_convert_encoding($char->literal, "latin1", "UTF-8");
//mysql_query("SET NAMES 'latin1'");
//$literal = utf8_decode($literal);
echo $literal .'<br>';
$sql = 'INSERT INTO `dico_kanji` ( `id` , `literal` ) VALUES (NULL , "'. $literal .'");';
if (isset($_GET['action']) && $_GET['action'] == 1) $req = @mysql_query($sql) or die('Erreur SQL !<br>'. $sql .'<br>'. mysql_error());
//echo '<img src="../images/bar.gif" alt="bar"/>';
}
$time_end = microtime(true);
$time = round($time_end - $time_start,2);
echo '<br />
<i>Kanji</i> insérés avec succès ('. $i .' entrées) <font color="grey">'. $time .' sec.</font></p>';
if (isset($_GET['action']) && $_GET['action'] == 1)
{
echo '<a href="./kanjidic2.php?action=1&step=2">Etape suivante</a>';
}
else
{
echo '<a href="./kanjidic2.php?step=2">Etape suivante</a>';
}
}
Alors, je vous explique ma démarche :
Il y a un document XML que je dois parser, il n'y a pas de souci à ce niveau. Je le fais avec simpleXML.
Les entrées "literal" sont des caractères japonais encodées en UTF-8. Apparemment, il y a un souci quand l'UTF-8 est forcé, soit disant il part du principe que l'encodage de base est latin1 (cp1252) et du coup, il encode une seconde fois en UTF-8, ce qui donne un résultat incorrect.
Voici plus de détail sur le problème :
http://dev.mysql.com/doc/refman/5.1/en/ ... -sets.html
Ils indiquent de faire un dump mais moi je ne veux pas faire ça ! Je veux convertir à la volée et injecter l'enregistrement dans la BDD.
Je suis sur que c'est trois fois rien à faire, mais j'en ai un peu marre. Merci de m'accorder un peu de votre temps !