diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3
index e5e92dc889de8745c1fd464083559287b8a538b6..7931aba1a4e1a2e7a794ba9da3d049c575bc9cfe 100644
--- a/ecrire/inc_filtres.php3
+++ b/ecrire/inc_filtres.php3
@@ -21,8 +21,10 @@ function entites_html($texte) {
 	return corriger_entites_html(htmlspecialchars($texte));
 }
 
-
 function filtrer_entites($texte) {	// html -> texte, a completer
+	if (lire_meta('charset') != 'iso-8859-1')
+		return $texte;
+
 	// NB en php4 il suffirait d'utiliser get_html_translation_table/array_flip
 	// HTML_ENTITIES
 	$trans = array(
@@ -149,14 +151,22 @@ function strtr2 ($texte, $trans) {
 //
 
 // transforme une chaine en entites unicode 
-function entites_unicode($chaine) {
-	switch(lire_meta('charset')) {
+function entites_unicode($chaine, $charset='AUTO') {
+	if ($charset == 'AUTO')
+		$charset=lire_meta('charset');
+
+	switch($charset) {
 
-		case '':
 		case 'iso-8859-1':
-		// On commente cet appel tant qu'il reste des spip < 1.5 dans la nature
+		// On commente cet appel tant qu'il reste des spip v<1.5 dans la nature
 		//	$chaine = iso_8859_1_to_unicode($chaine);
 			break;
+		// FORCE-iso-8859-1 passe le message suivant : on VEUT la conversion, meme
+		// si elle est desactivee dans entites_unicode pour maintenir (temporairement)
+		// la lisibilite de notre backend sur des SPIP v<1.5
+		case 'FORCE-iso-8859-1':
+			$chaine = iso_8859_1_to_unicode($chaine);
+			break;
 
 		case 'utf-8':
 			$chaine = utf_8_to_unicode($chaine);
@@ -169,10 +179,12 @@ function entites_unicode($chaine) {
 }
 
 // transforme les entites unicode &#129; dans le charset courant
-function unicode2charset($chaine) {
-	switch(lire_meta('charset')) {
+function unicode2charset($chaine, $charset='AUTO') {
+	if ($charset == 'AUTO')
+		$charset=lire_meta('charset');
+
+	switch($charset) {
 
-		case '':
 		case 'iso-8859-1':
 			$chaine = unicode_to_iso_8859_1($chaine);
 			break;
@@ -335,6 +347,8 @@ function liens_ouvrants ($texte) {
 
 // Corrige les caracteres degoutants utilises par les Windozeries
 function corriger_caracteres($texte) {
+	if (lire_meta('charset') != 'iso-8859-1')
+		return $texte;
 	// 145,146,180 = simple quote ; 147,148 = double quote ; 150,151 = tiret long
 	return strtr($texte, chr(145).chr(146).chr(180).chr(147).chr(148).chr(150).chr(151), "'''".'""--');
 }
@@ -349,6 +363,8 @@ function PtoBR($texte){
 
 // Majuscules y compris accents, en HTML
 function majuscules($texte) {
+	if (lire_meta('charset') != 'iso-8859-1')
+		return $texte;
 	$suite = htmlentities($texte);
 	$suite = ereg_replace('&amp;', '&', $suite);
 	$suite = ereg_replace('&lt;', '<', $suite);
@@ -499,7 +515,7 @@ function affdate_base($numdate, $vue) {
 	if ($mois > 0){
 		$saison = "hiver";
 		if (($mois == 3 AND $jour >= 21) OR $mois > 3) $saison = "printemps";
-		if (($mois == 6 AND $jour >= 21) OR $mois > 6) $saison = "\xe9t\xe9";
+		if (($mois == 6 AND $jour >= 21) OR $mois > 6) $saison = unicode2charset("&#233;t&#233;");
 		if (($mois == 9 AND $jour >= 21) OR $mois > 9) $saison = "automne";
 		if (($mois == 12 AND $jour >= 21) OR $mois > 12) $saison = "hiver";
 	}
diff --git a/ecrire/inc_index.php3 b/ecrire/inc_index.php3
index a21ab9d280df259ad5da6a95f56c06de3b934333..eccecb562f3bf4fe9b423f429fe6721650b17c8d 100644
--- a/ecrire/inc_index.php3
+++ b/ecrire/inc_index.php3
@@ -21,9 +21,11 @@ function nettoyer_chaine_indexation($texte) {
 		/* u */ chr(249).chr(250).chr(251).chr(252).
 		/* yNn */ chr(255).chr(209).chr(241);
 	$texte = ereg_replace("<[^<]*>", "", $texte);
-	return strtolower(strtr($texte,
-		$accents,
-		"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"));
+	if (lire_meta('charset') == 'iso-8859-1')
+		$texte = strtolower(strtr($texte,
+			$accents,
+			"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"));
+	return $texte;
 }
 
 // Merci a Herve Lefebvre pour son apport sur cette fonction
diff --git a/ecrire/inc_sites.php3 b/ecrire/inc_sites.php3
index 39fbc7ae1ed8632c55fe0abef83a1a8bcdc4f815..aa78b0deb4650fe6958d1eeccd39979998c4db15 100644
--- a/ecrire/inc_sites.php3
+++ b/ecrire/inc_sites.php3
@@ -73,21 +73,39 @@ function recuperer_page($url) {
 		}
 	}
 
-	if (!$f)
+	if (!$f) {
 		spip_log("ECHEC syndication $url$via_proxy");
-	else {
+		$result = '';
+	} else {
 		while (!feof($f))
 			$result .= fread($f, 16384);
 		fclose($f);
-		return $result;
 	}
+
+	// analyser cette page pour trouver un charset connu hors iso-8859-1,
+	// et convertir dans le charset local ; si la page n'a pas de charset,
+	// ne pas la decoder (on suppose qu'elle est iso-8859-1)... sauf si
+	// le charset local n'est pas iso-8859-1
+	if (eregi("<[^>]*charset.(utf-8)", $result, $regs)) {
+		$charset_page = $regs[1];
+		$result = unicode2charset(entites_unicode($result, $charset_page));
+	} else
+		if (lire_meta('charset' != 'iso-8859-1'))
+			$result = unicode2charset(entites_unicode($result, 'FORCE-iso-8859-1'));
+
+	// FORCE-iso-8859-1 passe le message suivant : on VEUT la conversion, meme
+	// si elle est desactivee dans entites_unicode pour maintenir (temporairement)
+	// la lisibilite de notre backend sur des SPIP v<1.5
+
+
+	return $result;
 }
 
 
 function analyser_site($url) {
 	include_ecrire("inc_filtres.php3");
 
-	$texte = unicode2charset(iso_8859_1_to_unicode(recuperer_page($url)));
+	$texte = recuperer_page($url);
 	if (!$texte) return false;
 	$result = '';
 	if (ereg('<channel[^>]*>(.*)</channel>', $texte, $regs)) {
@@ -146,7 +164,7 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
 	else
 		$moderation = 'publie';	// en ligne sans validation
 
-	$le_retour = unicode2charset(iso_8859_1_to_unicode(recuperer_page($la_query)));
+	$le_retour = recuperer_page($la_query);
 
 	if (strlen($le_retour)>10){
 
diff --git a/ecrire/inc_texte.php3 b/ecrire/inc_texte.php3
index aa0626e35ee3d7eaa81ec3ef11f2002678560c73..44d42cf10caafad01aab272fb468bebf923746b0 100644
--- a/ecrire/inc_texte.php3
+++ b/ecrire/inc_texte.php3
@@ -262,27 +262,25 @@ function interdire_scripts($source) {
 
 // Correction typographique francaise
 function typo_fr($letexte) {
-	global $flag_preg_replace;
-	global $flag_str_replace;
-
-	// les "blancs durs" et les guillemets
-	if ($flag_str_replace){
-		$letexte = str_replace("&nbsp;","~",strtr($letexte,chr(160),"~"));
-		$letexte = str_replace("&raquo;",chr(187),$letexte);
-		$letexte = str_replace("&#187;", chr(187),$letexte);
-		$letexte = str_replace("&laquo;",chr(171),$letexte);
-		$letexte = str_replace("&#171;", chr(171),$letexte);
-	}
-	else {
-		$letexte = ereg_replace("&nbsp;","~",strtr($letexte,chr(160),"~"));
-		$letexte = ereg_replace("&(raquo|#187);",chr(187), $letexte);
-		$letexte = ereg_replace("&(laquo|#171);",chr(171), $letexte);
+
+	// nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg
+	if (lire_meta('charset') == 'iso-8859-1') {
+		$letexte = strtr($letexte,chr(160),"~");
+		$chars = array (187,171,176);
+		while (list(,$c) = each($chars))
+			$letexte = ereg_replace(chr($c),"&#$c;",$letexte);
 	}
 
+	// unifier sur la representation unicode
+	$letexte = ereg_replace("&nbsp;","~",$letexte);
+	$letexte = ereg_replace("&raquo;","&#187;",$letexte);
+	$letexte = ereg_replace("&laquo;","&#171;",$letexte);
+	$letexte = ereg_replace("&deg;","&#176;",$letexte);
+
 	$cherche1 = array(
 		/* 2 */ 	'/((^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/',
-		/* 3 */		'/([:!?'.chr(187).']| -,)/',
-		/* 4 */		'/('.chr(171).'|(M(M?\.|mes?|r\.?)|[MnN]'.chr(176).') )/'
+		/* 3 */		'/([:!?]|&#187;| -,)/',
+		/* 4 */		'/(&#171;|(M(M?\.|mes?|r\.?)|[MnN]&#176;) )/'
 	);
 	$remplace1 = array(
 		/* 2 */		'\1~;',
@@ -304,6 +302,13 @@ function typo_fr($letexte) {
 
 	$letexte = ereg_remplace($cherche2, $remplace2, $letexte);
 
+	// remettre le caractere simple ??
+	if (lire_meta('charset') == 'iso-8859-1') {
+		$chars = array (187,171,176);
+		while (list(,$c) = each($chars))
+			$letexte = ereg_replace("&#$c;",chr($c),$letexte);
+	}
+
 	return ($letexte);
 }