diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
index b867dd8ccdf16ab5e116fde4b29f06599c498349..1ef6919283910186e04b8bba80531f24cd474b07 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
@@ -1,6 +1,9 @@
 /* Copyright (c) 2002-2010 Dovecot Sieve authors, see the included COPYING file
  */
 
+#include "lib.h"
+#include "unichar.h"
+
 #include "sieve-common.h"
 #include "sieve-commands.h"
 #include "sieve-code.h"
@@ -238,8 +241,8 @@ bool mod_lower_modify(string_t *in, string_t **result)
 bool mod_length_modify(string_t *in, string_t **result)
 {
 	*result = t_str_new(64);
-	str_printfa(*result, "%llu", (unsigned long long) str_len(in));
-
+	str_printfa(*result, "%llu", (unsigned long long) 
+		uni_utf8_strlen_n(str_data(in), str_len(in)));
 	return TRUE;
 }
 
diff --git a/tests/extensions/variables/modifiers.svtest b/tests/extensions/variables/modifiers.svtest
index 7252331a736bffc0eb3f08b7d9ed355272a349cf..6948aecabb946ec85e2008ac140ae895f4480144 100644
--- a/tests/extensions/variables/modifiers.svtest
+++ b/tests/extensions/variables/modifiers.svtest
@@ -1,5 +1,6 @@
 require "vnd.dovecot.testsuite";
 require "variables";
+require "encoded-character";
 
 /*
  * Modifiers
@@ -138,3 +139,14 @@ test "RFC examples" {
 		test_fail "modified assignment failed (6): ${a}";
 	}	
 }
+
+/* RFC mentions `characters' and not octets */
+
+test "Modifier :length utf8" {
+	set "a" "Das ist ${unicode: 00fc}berhaupt nicht m${unicode: 00f6}glich.";
+
+	set :length "b" "${a}";
+    if not string "${b}" "32" {
+        test_fail "incorrect number of unicode characters reported: ${b}/32";
+    }
+}