Page 1 sur 1

Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 15:01
par Zatpo
Bonjour,
Je rencontre un problème que je n'arrive pas à résoudre depuis 15 jours, lors de l'export des données et plus précisément lors de la conversion si j'ai bien compris.
Tout les reste du site internet fonctionne correctement, ajout de texte, lecture de texte, je ne rencontre ce problème que lors de l'export de données.
Le code fourni est celui du logiciel, je n'ai pas programmé ceci, de plus je suis plutôt novice.

Je suis en PHP Version 5.3.3
En en-tête il y a marqué UTF-8 de partout sur le code source

Base de données, voici le résultat de : SHOW VARIABLES LIKE "character%"
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

Je prend par exemple le "é"
Dans la base de données il y a des variables en HTML ("é") et des variables ("é")

Lors de l'export, je retrouve dans le fichier exporté en XML les variables en HTML ("é") sont bien transformées en " & # 2 3 3 ;" (j'ai mis des espaces pour que les informations soient lisibles), là pas de soucis, mais les variables "é" sont transformées en " & # 1 9 5 ; & # 1 6 9 ;" (j'ai mis des espaces pour que les informations soient lisibles)

Voici le code qui me semble faire défaut, je pense que ça vient de la fonction "get_html_translation_table"
if( !function_exists('XMLentities_table') ) {
		function XMLentities_table($type, $charset) {
			static $trans = array();
			if( empty($trans[$type][$charset]) ) {
				
				foreach(get_html_translation_table(HTML_ENTITIES, $type) as $char => $entity)
					$trans[$type][$charset][$char] = "&#".ord($char).';';
				for($i=127; $i <= 256; $i++) 
					$trans[$type][$charset][chr($i)] = "&#$i;";
				ksort($trans[$type][$charset]);
			}
			return $trans[$type][$charset];
		}
	
		function XMLentities($str, $entType=ENT_COMPAT, $charset="UTF-8" /*"ISO-8859-1"*/) {
			static $trans = array();
			
			if( empty($trans[$entType][$charset]) ) {
				$trans[$entType][$charset] = XMLentities_table($entType, $charset);
			}
			$s = '';
			// TB silence
			foreach(preg_split('//', $str) as $c) {
				if( isset($trans[$entType][$charset][$c]) )
					$s .= $trans[$entType][$charset][$c];
				else
					$s .= $c;
			}
			return $s;
		}
		
		function XMLentities_decode($str, $entType=ENT_COMPAT, $charset="UTF-8" /*"ISO-8859-1"*/) {
			static $decodeTrans = array();
			
			if( empty($decodeTrans[$entType][$charset]) ) {
				$decodeTrans[$entType][$charset] = array_flip(XMLentities_table($entType, $charset));
				ksort($decodeTrans[$entType][$charset]);
			}
			$pattern = '/(&#\d+;)/';
			$matches = array();
			if( preg_match_all($pattern, $str, $matches) ) {
				foreach($matches[1] as $idx => $entValue) {
					if( isset($decodeTrans[$entType][$charset][$entValue]) ) {
						$str = str_replace($matches[0][$idx], $decodeTrans[$entType][$charset][$entValue], $str);
					}
				}
			}
			return $str;
		}
	}


Si quelqu'un peu m'en dire un peu plus SVP? ou une idée?

J'en peux plus, j'ai vraiment besoin d'aide s'il vous plait.

Si vous avez besoin d'information supplémentaires, n'hésitez pas à me les demander.

Cordialement

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 15:04
par xTG
La fonction ord() ne fonctionne qu'avec un encodage iso et donc rate lamentablement la conversion à partir de l'utf8. :)
Tu as une alternative dans le premier commentaire de la doc : http://php.net/manual/fr/function.ord.php

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 15:14
par Invité
Bonjour,
Merci pour votre réponse rapide.

Je dois intégrer une bonne grosse partie de code en plus alors.
Je suis un peu novice ça risque d'être compliqué.

Je vais chercher, ca risque de prendre plusieurs heures ou jours, si vous voyez le code plus rapidement et que vous avez une minutes, je vous en serai très très très , mais vraiment très reconnaissant.

Cordialement

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 15:28
par moogli
y a pas grand chose à faire, il te suffit de copier le code de la fonction (avant celui que tu indique) et de remplacer la fonction ord par ordutf8 (qui est celle que tu aura donc copier).


@+

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 15:37
par Invité
Bonjour,
Je m'y met et reviens vers le forum dans quelques minutes, ou heures suivant mes capacités.

Merci.

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 15:57
par Invité
Bonjour,
Voici le code modifié, mais ca ne corrige pas le problème, c'est pareil.
........
// Modifications Julien
	function ordutf8($string, &$offset) {
    $code = ord(substr($string, $offset,1)); 
    if ($code >= 128) {        //otherwise 0xxxxxxx
        if ($code < 224) $bytesnumber = 2;                //110xxxxx
        else if ($code < 240) $bytesnumber = 3;        //1110xxxx
        else if ($code < 248) $bytesnumber = 4;    //11110xxx
        $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0);
        for ($i = 2; $i <= $bytesnumber; $i++) {
            $offset ++;
            $code2 = ord(substr($string, $offset, 1)) - 128;        //10xxxxxx
            $codetemp = $codetemp*64 + $code2;
        }
        $code = $codetemp;
    }
    $offset += 1;
    if ($offset >= strlen($string)) $offset = -1;
    return $code;
}
	//FIN Modifications Julien et remplacement ligne 125 de ord( par ordutf8(

	
	// Hack for EZom environment
	if( !function_exists('XMLentities_table') ) {
		function XMLentities_table($type, $charset) {
			static $trans = array();
			if( empty($trans[$type][$charset]) ) {
				foreach(get_html_translation_table(HTML_ENTITIES, $type) as $char => $entity)
					$trans[$type][$charset][$char] = "&#".ordutf8($char).';';
				for($i=127; $i <= 256; $i++) 
					$trans[$type][$charset][chr($i)] = "&#$i;";
				ksort($trans[$type][$charset]);
			}
			return $trans[$type][$charset];
		}
	
		function XMLentities($str, $entType=ENT_COMPAT, $charset="UTF-8" /*"ISO-8859-1"*/) {
			static $trans = array();
			
			if( empty($trans[$entType][$charset]) ) {
				$trans[$entType][$charset] = XMLentities_table($entType, $charset);
			}
			$s = '';
			// TB silence
			foreach(preg_split('//', $str) as $c) {
				if( isset($trans[$entType][$charset][$c]) )
					$s .= $trans[$entType][$charset][$c];
				else
					$s .= $c;
			}
			return $s;
		}
		
		function XMLentities_decode($str, $entType=ENT_COMPAT, $charset="UTF-8" /*"ISO-8859-1"*/) {
			static $decodeTrans = array();
			
			if( empty($decodeTrans[$entType][$charset]) ) {
				$decodeTrans[$entType][$charset] = array_flip(XMLentities_table($entType, $charset));
				ksort($decodeTrans[$entType][$charset]);
			}
			$pattern = '/(&#\d+;)/';
			$matches = array();
			if( preg_match_all($pattern, $str, $matches) ) {
				foreach($matches[1] as $idx => $entValue) {
					if( isset($decodeTrans[$entType][$charset][$entValue]) ) {
						$str = str_replace($matches[0][$idx], $decodeTrans[$entType][$charset][$entValue], $str);
					}
				}
			}
			return $str;
		}
	}	// if !function_exists(XMLenttities_table)
........

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 16:40
par xTG
En troisième paramètre de la fonction get_html_translation_table il faut préciser l'encodage.
Par défaut il prend de l'iso aussi.
foreach(get_html_translation_table(HTML_ENTITIES, $type, "UTF-8") as $char => $entity)

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 16:55
par Invité
Re, merci.

Ca n'a pas changé.

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 17:15
par Invité
Bonjour,
Je rappelle qu'il y a des variables en HTML ("&eacute;") et des variables ("é")
Les variables HTML sont bien transformée mais les variables "é" sont transformées en "& # 1 9 5 ; & # 1 6 9 ; " lues ""é""
Cordialement

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 17:17
par Invité
J'ai ouvert le fichier xml avec notepad+++ qui me dit que l'encodage est en UTF-8 without BOM, si ca peut faire avancer.

Re: Convertion pour export, problème de caractères

Posté : 23 nov. 2012, 17:29
par Invité
Bonjour,
J'ai mis deux ligne en commentaires pour annuler le code, et ca corrige bien les "é" mais cette fois ci c'est les
accents du code HTML qui sont transformé en carré noir avec point d'interrogation.

// for($i=127; $i <= 256; $i++)
// $trans[$type][$charset][chr($i)] = "&#$i;";

Voici le code :

// Modifications Julien
	function ordutf8($string, &$offset) {
    $code = ord(substr($string, $offset,1)); 
    if ($code >= 128) {        //otherwise 0xxxxxxx
        if ($code < 224) $bytesnumber = 2;                //110xxxxx
        else if ($code < 240) $bytesnumber = 3;        //1110xxxx
        else if ($code < 248) $bytesnumber = 4;    //11110xxx
        $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0);
        for ($i = 2; $i <= $bytesnumber; $i++) {
            $offset ++;
            $code2 = ord(substr($string, $offset, 1)) - 128;        //10xxxxxx
            $codetemp = $codetemp*64 + $code2;
        }
        $code = $codetemp;
    }
    $offset += 1;
    if ($offset >= strlen($string)) $offset = -1;
    return $code;
}
	//FIN Modifications Julien et remplacement ligne 125 de ord( par ordutf8(
	
	
	// Hack for EZom environment
	if( !function_exists('XMLentities_table') ) {
		function XMLentities_table($type, $charset) {
			static $trans = array();
			if( empty($trans[$type][$charset]) ) {
				foreach(get_html_translation_table(HTML_ENTITIES, $type, "UTF-8") as $char => $entity)
					$trans[$type][$charset][$char] = "&#".ordutf8($char).';';
			//	for($i=127; $i <= 256; $i++) 
			//		$trans[$type][$charset][chr($i)] = "&#$i;";
				ksort($trans[$type][$charset]);
			}
			return $trans[$type][$charset];
		}
	
		function XMLentities($str, $entType=ENT_COMPAT, $charset="UTF-8" /*"ISO-8859-1"*/) {
			static $trans = array();
			
			if( empty($trans[$entType][$charset]) ) {
				$trans[$entType][$charset] = XMLentities_table($entType, $charset);
			}
			$s = '';
			// TB silence
			foreach(preg_split('//', $str) as $c) {
				if( isset($trans[$entType][$charset][$c]) )
					$s .= $trans[$entType][$charset][$c];
				else
					$s .= $c;
			}
			return $s;
		}
		
		function XMLentities_decode($str, $entType=ENT_COMPAT, $charset="UTF-8" /*"ISO-8859-1"*/) {
			static $decodeTrans = array();
			
			if( empty($decodeTrans[$entType][$charset]) ) {
				$decodeTrans[$entType][$charset] = array_flip(XMLentities_table($entType, $charset));
				ksort($decodeTrans[$entType][$charset]);
			}
			$pattern = '/(&#\d+;)/';
			$matches = array();
			if( preg_match_all($pattern, $str, $matches) ) {
				foreach($matches[1] as $idx => $entValue) {
					if( isset($decodeTrans[$entType][$charset][$entValue]) ) {
						$str = str_replace($matches[0][$idx], $decodeTrans[$entType][$charset][$entValue], $str);
					}
				}
			}
			return $str;
		}
	}	// if !function_exists(XMLenttities_table)