Convertion pour export, problème de caractères

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Convertion pour export, problème de caractères

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

par Invité » 23 nov. 2012, 17:29

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)

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

par Invité » 23 nov. 2012, 17:17

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

par Invité » 23 nov. 2012, 17:15

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

par Invité » 23 nov. 2012, 16:55

Re, merci.

Ca n'a pas changé.

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

par xTG » 23 nov. 2012, 16:40

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

par Invité » 23 nov. 2012, 15:57

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

par Invité » 23 nov. 2012, 15:37

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

par moogli » 23 nov. 2012, 15:28

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

par Invité » 23 nov. 2012, 15:14

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

par xTG » 23 nov. 2012, 15:04

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

Convertion pour export, problème de caractères

par Zatpo » 23 nov. 2012, 15:01

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 ("&eacute;") et des variables ("é")

Lors de l'export, je retrouve dans le fichier exporté en XML les variables en HTML ("&eacute;") 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