[PHP] Convertir en code html/entité numérique - ex: é -> é | 型 ->& #22411;

Salut!

Je vais enfin prendre le temps de m’occuper de ma base de données dont la recherche ne fonctionne plus depuis un moment.

En effet, quand mon provider était passé à une nouvelle version de mysql, les recherches sur les caractères japonais furent impossibles.
Tous les caractères que j’avais écris en japonais dans la base de données se sont transformés en code html pour je ne sais quelle raison!

Maintenant, si j’ajoute un caractère japonais à ma base (en passant par phpmyadmin), et que je fais une recherche en entrant ce caractère, ça ne fonctionne pas non plus.

Si je fais une recherche en entrant le code html, je peux trouver mes caractères (par exemple & #20108; pour le caractère 二). Mais bien sûr, ce n’est pas ce que je désire ^o^…

Bon, donc, ce que j’aimerais faire:

  • Quand l’utilisateur saisit un caractère, le transformer en code html.

Ensuite, j’aimerais savoir pourquoi, alors que j’ai rentré un nouveau caractère, que je le vois bien dans phpmyadmin, lors de l’affichage de la page, j’ai des “???” à la place du caractère et de même si j’effectue une recherche sur ma page, en entrant ce caractère (en l’occurence 建), je ne le trouve pas.

Enfin, n’y aurait-il pas une possibilité de refaire passer toute la base de données des caractères HTML aux caractères “normaux” sans tout retaper :paf: (cela, bien sûr, si j’arrive à afficher correctement mes caractères…).

Voilà, merci d’avance encore une fois! :bounce:

mysql combien? T’es sûr qu’ils sont pas mis l’encodage latin & virer l’encodage japonais? (jit je crois)

MySQL version 4.1.19-standard

Pour ce qui est de l’encodage, toutes les tables étaient passées en “latin1_swedish_ci”. :neutre:

J’ai changé l’interclassement en “utf8_unicode_ci” (aux endroits où il y avait du japonais).

Ce qui m’étonne, c’est qu’avec l’ancienne version de mysql, il me semble que je n’avais pas défini d’encodage précis pour les tables, mais que ça fonctionnait quand même.

J’ai fait d’autres tests, mais j’ai toujours les mêmes problèmes >_<.

Ah ! Ce topic m’intéresse ! J’ai une table avec un champ avec des caractères en japonais. Quand j’éssaie de sortir le contenu dans une page, j’ai droit à des beaux ???.
Ma table est en utf8_general_ci et ma page contient

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Donc pensez à alyussium et si vous pensez savoir d’où vient mon problème, dites moi. :smiley:

Dans cette page:http://fr3.php.net/strings

ces fonctions peuvent peut être servir ici:
html_entity_decode – Convertit toutes les entités HTML en caractères normaux
htmlentities – Convertit tous les caractères éligibles en entités HTML
htmlspecialchars_decode – Convertit les entités HTML spéciales en caractères
htmlspecialchars – Convertit les caractères spéciaux en entités HTML

Sinon pour l’encodage j’ai jamais rien compris à leurs normes à la c… :neutre:

Sandrock> Pour moi, la seule solution est d’entrer les caractères au format HTML dans la base, ce qui n’est vraiment pas pratique du tout… Si tu n’as pas trop de caractères, ça peut servir, mais bon >_<.

popolof> Merci.
J’ai testé un peu tout, et je ne suis pas arrivé à un résultat convenable.

Concernant la fonction html_entity_decode, il faut aussi faire attention à ça:

*Edit:
Versions affectées:

  • PHP 4.3.x
  • PHP 4.4.x
  • PHP 5.0.x
  • PHP 5.1.x

(sources: un peu partout sur le net… ^^).

Moi, je ne comprends pas pourquoi en ayant la base en utf-8, la page web en utf-8, j’obtiens des ??? à la place de mes caractères :riva:

Quelques exemples pour mon cas:

En tentant de convertir ce caractère: 一 ( 1 ^^).

html_entity_decode --> à éviter pour le moment
htmlentities -->

htmlspecialchars_decode --> Il n’y a pas PHP 5 pour le moment >_<
htmlspecialchars -->

Donc… Voilà… même avec ces fonctions, je ne peux pas arriver à ce que je veux >_<.

Pour gérer l’international, j’utilise de l’utf-8. toutes les pages (mêmes les fraçiase) sont encodées en utf-8 et la base aussi, et les pages utilisent le charset utf-8.
On peut éventuellement afficher des caractères unicode, mais c’est plutôt des entités numérique, et pas les &eacute;
par exemple : (pas la moindre idée de ce que ça veut dire :D)


&& #38647; && #35834;

donne à laffichage: 雷诺

Avec les entités numériques, tu peux afficher des caractères unicodes quel que soit le charset de la page, mais il faut déjà au départ que la base soit en unicode (sinon, il faut stocker le charset avec le texte encodé, mais c’est la galère à gérer), à ce moment là, la valeur numérique de l’entité correspond directement à la valeur entière du caractère unicode (modulo les problèmes Little Endian, Big Endian -> UTF16LE et UTF16BE).

Bref, je compatis, même en tout unicode, c’est le b…
:slight_smile:

deltree, merci pour ta réponse ^^.

En gros, voilà ce qui pose problème pour moi.
Donc, au début, j’entrais tout par l’intermédiaire de PHPmyadmin, en japonais, et les caractères étaient bien affichés. Puis, avec les changement de version de mysql, se sont transformés en “entités numériques” (je ne connaissais pas ce terme^^).

La ligne avec le numéro 523 représente l’ancienne saisie transformée et la 524 celle que j’ai faite il y a peu. Sur mon site, qui est en UTF-8 donc (ainsi que la base ^^), la ligne 523 s’affiche correctement, mais pour la 524, j’ai des ???.
Si je fais une recherche avec le script (qui marchait avant), je n’obtiens rien, mais en rentrant la valeur de l’entité numérique, j’ai mon résultat:

:pt1cable:

Le problème est que même si j’essaye de rentrer les valeurs sous leur forme “entité numérique”, je ne peux pas effectuer de recherche O_O (d’où ma question de savoir si l’on pouvait transformer un caractère en entité numérique afin de le comparer à celui de la base… :paf:

P.S.:Pour les caractères, le premier représente le tonnerre. Quant au second, il n’est utilisé qu’en chinois d’après moi, donc… Je ne sais pas ^o^ :paf:

P.S.2: Je viens de voir que mon hébergeur va bientôt passer le serveur sur lequel je suis en PHP5 ^^.

P.S.3: J’ai modifié le titre du topic… Peut-être que cela sera plus explicite ^^

A l’occasion, il faudrait remettre la base d’équerre, mais en attendant, la question pour ceux qui codent en PHP (pas moi) est: y-a t-il un fonction pour encoder les entités numériques?

Sinon, tu peux refaire l’algo, soit en PHP, soit en javascript, en t’inspirant du fonctionnement de ce site:
http://www.kongming.net/novel/hanzi/convert/
en javascript, en bidoullant cette fonction: (mettre &#x au lieu de \u00)


/**
 * Returns a string which contains the Unicode equivalent of param s
 *
 * Params:
 *    s: Target String
 */
function convertString2Unicode(s)
{
   var uniString = "", hexVal, uniChar;

   for(var i = 0; i < s.length; ++i)
   {
      //Convert char to hex
      hexVal = Number(s.charCodeAt(i)).toString(16);

      //Convert to unicode by making sure hex is 4 chars long, padding with 0's if less
      uniChar = "<\\u>" + ("000" + hexVal).match(/.{4}$/)[0];

      uniString += uniChar;
   }

   return uniString;
}

Le gros problème est le suivant.

Posons une table contenant des caractères en utf8.
Posons aussi un apache avec php.

Si on echo directement le contenu de la table on obtient des ???.
La fonction htmlentities qui devriant aider convertit quelques entités de notre alphabet français mais rien de plus.
Faut donc qqchose sui convertis les symboles en entités…
N’y aurait-il pas une fonction MySQL ? -> Si pas de résultats sur le forum, je regarderai la doc.

J’ai trouvé quelques trucs:
http://fr3.php.net/manual/fr/ref.iconv.php
http://fr.php.net/mb_convert_kana

Après il m’a embrouillé avec ses kanas alors bon :paf:

Kikoo.

Je fais remonter ce sujet car j’ai trouvé un script cgi qui m’irai très bien pour ce que je veux.

Il se trouve sur cette page:
http://software.hixie.ch/utilities/cgi/uni…er/utf8-decoder
et le code source:
http://software.hixie.ch/utilities/cgi/uni…utf8-decoder.pl

J’aimerais savoir s’il était possible d’intégrer ce script dans mon code en php?
J’ai bien regardé le code, mais je ne connais pas du tout perl… (donc, je ne peux pas convertir en php ^^).

Merci d’avance! :oui:

P.S: D’après ce site, la valeur que je recherche serait celle qu’il appelle “raw character” et non pas HTML entities.

(deltree, je n’ai pas vraiment eu le temps de réfléchir à ta méthode ^^).

:hello:
>pas grave lol :wink:
Note, tu pourrait peut-être aussi refaire la tranfo inverse dans ta base: retransformer toutes les entites ou raw data en utf. soit avec un batch sur server, soit en local avec un extract. Il faut faire une petite analyse de texte, ou éventuellement en trouver une toute faie sur le net (plus dur)…

bonne chance :super:

^_^.

En fait, j’ai bien trouvé un script qui convertit des valeurs “raw characters” à mes valeurs en japonais:


<?php
$str = $_POST['s_kanji'];
//Converting numeric character references to unicode
echo $str.'<br />';
echo 'string to code points == ';
echo stringToCodePoints($str);

echo '<br />string to utf8 = ';

echo stringToUtf8($str);

function stringToCodePoints($str) {
 $str = fixCharacters($str);
 $str = preg_replace_callback(
 '/&#([0-9]+);/',
 create_function(
 '$s',
 'return $s[1];'
 ),
 $str
 );
 $str = preg_replace_callback(
 '/&#x([a-f0-9]+);/i',
 create_function(
 '$s',
 'return hexdec($s[1]);'
 ),
 $str
 );
 return $str;
}
function stringToUtf8($str) {
 $str = fixCharacters($str);
 $str = preg_replace_callback(
 '/&#([0-9]+);/',
 create_function(
 '$s',
 'return code2utf($s[1]);'
 ),
 $str
 );
 $str = preg_replace_callback(
 '/&#x([a-f0-9]+);/i',
 create_function(
 '$s',
 'return code2utf(hexdec($s[1]));'
 ),
 $str
 );
 return $str;
}
function fixCharacters($str) {
 $r = array(
 '& #128;' => '& #8364;',
 '& #129;' => '',
 '& #130;' => '& #8218;',
 '& #131;' => '& #402;',
 '& #132;' => '& #8222;',
 '& #133;' => '& #8230;',
 '& #134;' => '& #8224;',
 '& #135;' => '& #8225;',
 '& #136;' => '& #710;',
 '& #137;' => '& #8240;',
 '& #138;' => '& #352;',
 '& #139;' => '& #8249;',
 '& #140;' => '& #338;',
 '& #141;' => '',
 '& #142;' => '& #381;',
 '& #143;' => '',
 '& #144;' => '',
 '& #145;' => '& #8216;',
 '& #146;' => '& #8217;',
 '& #147;' => '& #8220;',
 '& #148;' => '& #8221;',
 '& #149;' => '& #8226;',
 '& #150;' => '& #8211;',
 '& #151;' => '& #8212;',
 '& #152;' => '& #732;',
 '& #153;' => '& #8482;',
 '& #154;' => '& #353;',
 '& #155;' => '& #8250;',
 '& #156;' => '& #339;',
 '& #157;' => '',
 '& #158;' => '& #382;',
 '& #159;' => '& #376;'
 );
 return strtr($str, $r);
}
// From php.net:
function code2utf($num){
 if ($num < 128) {
  return chr($num);
 }
 if ($num < 2048) {
  return chr(($num >> 6) + 192) . chr(($num & 63) + 128);
 }
 if ($num < 65536) {
  return chr(($num >> 12) + 224) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
 }
 if ($num < 2097152) {
  return chr(($num >> 18) + 240) . chr((($num >> 12) & 63) + 128) . chr((($num >> 6) & 63) + 128) . chr(($num & 63) + 128);
 }
 return '';
}

?>

Si je rentre & #19968; (dans l’espace entre & et #), j’obtiens bien le caractère 一 (un). Mais j’aimerais bien avoir l’inverse ^^ aussi. (car là, je pourrais obtenir un résultat, mais il faudrait que je convertisse d’abord tous les “raw characters” en caractères japonais puis que je compare avec la chaîne entrée… Pas très pratique…
Ca serait mieux d’avoir le contraire, que l’on saisisse le caractère, celui-ci est transformé en “raw character” et puis comparé à la base ^^.

Note: Je n’ai pas réussi à inverser ce code O_O… (je ne suis pas très bon >_<).

Edit: j’ai dû mettre des espace après le & pour que le code puisse être vu correctement!

J’y connais rien du tout en Jap, mais tu as

http://fr.php.net/manual/en/ref.mbstring.php

Pour manipuler des chaînes de caractères multi byte tel que le Jap. Tu dois même avoir de quoi transformer les caractères en entités unicode.

(je m’en suis jamais servi donc j’en dis pas plus)

Merci bien Sans-Nom.

Je suis déjà tombé plusieurs fois sur cette mbstring (dans mes recherches ^^), mais je n’ai pas encore vraiment lu la documentation. J’espère y trouver une fontion de conversion, ça metterait fin à bien des casse-tête! :paf:

Salut a tous
je tombe sur ce sujet par hasard mais j’ai fait des fonction de convertion en PHP qui peuvent vous interesser

conversion UTF8 vers code HTML ( &#x 0000;)
conversion code HTML vers UTF8
conversion Unicode (big ou little Indian) vers code HTML
conversion code HTML vers Unicode (big ou little Indian)

Pour l’unicode j’en ai aussi en javascript
si ca vous interesse je peu vous les fournir
A+