diff --git src/eval.c src/eval.c
index 5ced88e..5832a10 100644
--- src/eval.c
+++ src/eval.c
@@ -19584,7 +19584,14 @@ f_strgetchar(typval_T *argvars, typval_T *rettv)
 		break;
 	    }
 	    --charidx;
-	    byteidx += mb_char2len(str[byteidx]);
+	    if (enc_utf8)
+	    {
+		int u8c;
+		u8c = utf_ptr2char(str + byteidx);
+		byteidx += utf_char2len(u8c);
+	    }
+	    else
+		byteidx += mb_char2len(str[byteidx]);
 	}
     }
 #else
diff --git src/testdir/test_expr.vim src/testdir/test_expr.vim
index c8c8e2c..63d5bf8 100644
--- src/testdir/test_expr.vim
+++ src/testdir/test_expr.vim
@@ -59,6 +59,17 @@ func Test_strgetchar()
   call assert_equal(-1, strgetchar('axb', -1))
   call assert_equal(-1, strgetchar('axb', 3))
   call assert_equal(-1, strgetchar('', 0))
+
+  call assert_equal(char2nr('あ'), strgetchar('あaい', 0))
+  call assert_equal(char2nr('a'), strgetchar('あaい', 1))
+  call assert_equal(char2nr('い'), strgetchar('あaい', 2))
+
+  call assert_equal(char2nr('á'), strgetchar('áxb', 0))
+  call assert_equal(char2nr('x'), strgetchar('áxb', 1))
+
+  call assert_equal(char2nr('a'), strgetchar('àxb', 0))
+  call assert_equal(char2nr('̀'), strgetchar('àxb', 1))
+  call assert_equal(char2nr('x'), strgetchar('àxb', 2))
 endfunc
 
 func Test_strcharpart()
