diff --git a/ecrire/inc/charsets.php b/ecrire/inc/charsets.php
index 2817069c826c039a6d0d78d8aaaa55fb4953a6e4..d22f4328b183630973321e378a7ab2d7a5aba1cf 100644
--- a/ecrire/inc/charsets.php
+++ b/ecrire/inc/charsets.php
@@ -680,12 +680,12 @@ function spip_substr($c, $start=0, $end='') {
 	}
 
 	// version manuelle
-	$re_char="(?:[\300-\377][\200-\277]*|[\1-\200])";
+	$re_char="(?:[\300-\377][\200-\277]*|.)";
 	if($start==0) {
-		$restart='';
+		$re_start='';
 	} else {
 		if($start<0) {
-			$start= ($l=utf_strlen($c))+$start;
+			$start= ($l=spip_strlen($c))+$start;
 		}
 		$re_start= "(?:$re_char\{$start})";
 	}
@@ -694,7 +694,7 @@ function spip_substr($c, $start=0, $end='') {
 		$re_end="(.*)";
 	} else {
 		if($end<0) {
-			$end= ($l?$l:utf_strlen($c))+$end-$start;
+			$end= ($l?$l:spip_strlen($c))+$end-$start;
 		}
 		$re_end="($re_char\{0,$end})";
 	}