Convertir une chaine utf8 contenant des caractères français en iso-8859-1

Soyez le premier à donner votre avis sur cette source.

Vue 54 226 fois - Téléchargée 676 fois

Description

mon besoin de developper ce code c'est comment
convertir un string UTF-8 contenant des caractère français exemple(communauté) en iso-8859-1 exemple (communauté)

Source / Exemple :


$str = "communauté et espérons";
$str_result = convertUTF8_to_8859($str);
echo $str_result; // affiche :  communauté et espérons
function convertUTF8_to_8859($str){	
	// fonction qui test si la chaine est encodé en UTF8
	if(is_utf8($str) == 1){  
		// fonction qui test si la chaine encodé en UTF8 contient des caractère français: Cette fonction ne traite que des chaines en UTF8
		if(content8859_in_UTF8($str)=="TRUE"){
			// On convertit la chaine de UTF8 en ISO8859-1
			$str = utf8_decode($str);
			// retourner la chaine converti 
			return($str);
		}else{ // cas ou la chaine en UTF-8 mais ne contient pas des accents français (é,é,à,ù,û......) : exemple les caractères chinois encodé en UTF8
			// retourner la chaine non convertit
			return($str);
		}
	}else{ // cas ou la chaine n'est pas encodé en UTF8
		return($str);
	}
}
// Returns true if $string is valid UTF-8 and false otherwise. 
function is_utf8($string) { 

	// From http://w3.org/International/questions/qa-forms-utf-8.html 
	return preg_match('%^(?: 
		[\x09\x0A\x0D\x20-\x7E]            # ASCII 
		| [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte 
		|  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs 
		| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte 
		|  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates 
		|  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3 
		| [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15 
		|  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16 
	)*$%xs', $string); 
} // function is_utf8 

// fonction qui cherche s'il ya des caractres accentus franais dans une chaine en UTF8
function content8859_in_UTF8($str){
	
	if ( strlen($str) == 0 ) { return; }  
	// cette fonction ne retourne de valeur si la chaine est en UTF8
	// cette fonction retourne un tableau contenant les chaines accentuées 
	preg_match_all('/.{1}|[^\x00]{1,1}$/us', $str, $ar);
	$chars = $ar[0];
	$str_fr = 0;
	foreach ( $chars as $i => $c ){
		$ud = 0;
		// Calcul les codes ASCII des chaines en UTF8
		if (ord($c{0})>=0   && ord($c{0})<=127) { continue; } // ASCII - next please
		if (ord($c{0})>=192 && ord($c{0})<=223) { $ord = (ord($c{0})-192)*64 + (ord($c{1})-128); }
		if (ord($c{0})>=224 && ord($c{0})<=239) { $ord = (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128); }
		if (ord($c{0})>=240 && ord($c{0})<=247) { $ord = (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128); }
		if (ord($c{0})>=248 && ord($c{0})<=251) { $ord = (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128); }
		if (ord($c{0})>=252 && ord($c{0})<=253) { $ord = (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128); }
		if (ord($c{0})>=254 && ord($c{0})<=255) { $chars{$i} = $unknown; continue; } //error
			//Test si les caractères contient les accents (à, é,è,ù,ç,ê,â,û,........)
			if(($ord == 224) || ($ord == 226) || ($ord == 235) || ($ord == 249) || ($ord == 250) ||
			    ($ord == 252) || ($ord == 251) || ($ord == 233) || ($ord == 234) || ($ord == 232) || 
			    ($ord == 231) || ($ord == 228) || ($ord == 256) || ($ord == 128) || ($ord == 156) ||
			    ($ord == 230) || ($ord == 231) || ($ord == 244) || ($ord == 225) || ($ord == 236) ||
			    ($ord == 227) || ($ord == 237) || ($ord == 238) || ($ord == 249) || ($ord == 239) ||
			    ($ord == 257)){
				$str_fr =1;
			} 
	}
	if($str_fr == 1){
		return "TRUE";
	}else{
		return "FALSE";
	}
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

vilhjalms
Messages postés
591
Date d'inscription
mercredi 20 juillet 2005
Statut
Membre
Dernière intervention
16 juillet 2009
1 -
utf8_decode("communauté et espérons"); => communauté et espérons

Voir aussi l'encodage d'apache, de la page etc ...
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello, j'ai un peu de mal aussi...peux-tu expliquer plus clairement l'intérêt de ton code ? Je passe les inexactitude de code : pourquoi retourner "TRU3 ou "FALSE" au lieu de vrais booléens...? Par exemple.
domxml
Messages postés
7
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
16 août 2009
-
voilà je reponds à vos kestions
tout d'abord pour le valeur retourné par les fonctions de type string exemple "TRUE", c'est vrai ça étais etre retourné sous forme de boolien==> ça reste une amélioration.
Alors pour l'explication de besoin ce Code:
le besoin c'etais ya des pages dont les formats encodés en UTF-8. De plus dans les balises meta c'est pas indiqué le charset iso-8859-1. Donc si on met des String contentant des carcatères français accentués ses pages vont avoir automatiquement l'encodage UTF-8(vu que la format de la page c'est en UTF-8).
Alors pour convertir ses chaines là en iso-8859-1, il ya la fameuse fonction utf8-decode().Mais le pb k'elles sont les caratères à convertir surtout s'il ya plusieurs langues exemple sur les forum internationaux ya le japonais, russe, arabe... (c'est pour ça la page est en UTF-8 car elle englobe tous)
Et là j'ai proposé cette solution==> C'est convertir que les chaines qui contiennent des caractères Français sont elle retourne la chaine comme elle l'est
L'algorithme:
si (chaine en UTF-8) alors
si(la chaine contient des chaines accentué ) alors
on convertit avec la fonction utf8-encode
sinon
on retrourne la chaine sans la modifié
finsi
sinon
on retrourne la chaine sans la modifié
finsi

> Donc on convert la chaine de fonction UTF-8 en iso-8859-1 seulement dans le cas où une chaine UTF-8 contenant des caractères accentués français

Pour le première Commentaire posté l'encodage ça rien avoir avec le Apache ou autre c'est juste relié au format de la page et au charset utilisé

je crois que le code est bien commenté si vous voulez avoir plus de precision

Voilou
Merci
malalam
Messages postés
10844
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Ca n'expolique pas pourquoi tu n'utilises pas directement utf8_decode () et utf8_encode () ... ? Quel apport ?
domxml
Messages postés
7
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
16 août 2009
-
utf8_decode -- Convertit une chaîne UTF-8 en ISO-8859-1
utf8_encode -- Convertit une chaîne ISO-8859-1 en UTF-8

donc je dois bien verfier que la chaine à convertir contenant des caratères iso-8859-1

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.