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 435 fois - Téléchargée 684 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

Messages postés
3
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
8 novembre 2010

Après avoir testé et corrigé mon code :

function convert($str){
$str_temp2=$str;
$str_res="";
$str_para=2000;
while (strlen($str_temp2)>$str_para){
$str_temp=substr($str_temp2,0,$str_para);
$str_temp2=substr($str_temp2,$str_para,strlen($str_temp2)-$str_para);
$str_res=$str_res.utf8_encode(convertUTF8_to_8859($str_temp));
}
$str_res=$str_res.utf8_encode(convertUTF8_to_8859($str_temp2));
return $str_res;
}

Au passage si quelqu'un a une idée sur le pourquoi sa fonction ne prend pas les chaines de caractère trop longues ca m'intéresse.
Messages postés
3
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
8 novembre 2010

J'ai résolu de manière un peu bourrine le problème :

function convert($str){
$str_temp2=$str;
$str_res="";
if(strlen($str_temp2)>1000){
while (strlen($str_temp2)>1000){
$str_temp=substr($str_temp2,0,999);
$str_temp2=substr($str_temp2,1000,strlen($str_temp2)-1);
$str_res=$str_res.utf8_encode(convertUTF8_to_8859($str_temp));
}
}else{
$str_res=utf8_encode(convertUTF8_to_8859($str_temp2));
}
return $str_res;
}
Messages postés
3
Date d'inscription
samedi 5 mars 2005
Statut
Membre
Dernière intervention
8 novembre 2010

J'ai le même soucis que ORDLA. La fonction fonctionne a merveille avec les chaines pas trop longue mais des qu'elle dépasse un certain nombre de caractère ca "ne fait plus rien".

Dommage ...
Messages postés
2
Date d'inscription
samedi 15 août 2009
Statut
Membre
Dernière intervention
18 août 2009

je vois pas bien où est le problème ça marche pas chez moi pour une langue chaîne: j'ai une chaîne de 4700 caractère, ce code m'affiche une page blanche sans message d'erreur sans rien... je comprend pas, je n'utilise ni GET ni rien je change juste la valeur de $str que je lui affecte une chaîne plus langue.
Messages postés
7
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
16 août 2009

Bonjour ORDLA,
J'ai fait un test de mon coté, la fonction ne pose un problème de limit de nombre de caractère et d'ailleurs y a pas de raison. Vérifie de ton coté sur le $str n'est pas passé en GET ou autre chose de ceci.
Cdt
Afficher les 21 commentaires

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.