diff -r 1c6b099ead89 src/edit.c
--- a/src/edit.c	Sun May 27 00:37:51 2012 +0200
+++ b/src/edit.c	Tue May 29 11:07:50 2012 +0400
@@ -10108,22 +10108,36 @@
 do_insert_char_pre(c)
     int c;
 {
-    char_u *res;
+    char_u	*res = NULL;
+#ifdef FEAT_MBYTE
+    char_u	buf[MB_MAXBYTES];
+#else
+    char_u	buf[2];
+#endif
 
     /* Return quickly when there is nothing to do. */
     if (!has_insertcharpre())
 	return NULL;
 
+#ifdef FEAT_MBYTE
+    if (has_mbyte)
+	buf[(*mb_char2bytes)(c, buf)] = NUL;
+    else
+#endif
+    {
+	buf[0] = c;
+	buf[1] = NUL;
+    }
+
     /* Lock the text to avoid weird things from happening. */
     ++textlock;
-    set_vim_var_char(c);  /* set v:char */
+    set_vim_var_string(VV_CHAR, buf, -1);  /* set v:char */
 
     if (apply_autocmds(EVENT_INSERTCHARPRE, NULL, NULL, FALSE, curbuf))
 	/* Get the new value of v:char.  It may be empty or more than one
 	 * character. */
-	res = vim_strsave(get_vim_var_str(VV_CHAR));
-    else
-	res = NULL;
+	if (strcmp(buf, get_vim_var_str(VV_CHAR)))
+	    res = vim_strsave(get_vim_var_str(VV_CHAR));
 
     set_vim_var_string(VV_CHAR, NULL, -1);  /* clear v:char */
     --textlock;
