patch 9.1.0430: getregionpos() doesn't handle one char selection

Problem:  getregionpos() doesn't handle one char selection.
Solution: Handle startspaces differently when is_oneChar is set.
          Also add a test for an exclusive charwise selection with
          multibyte chars (zeertzjq)

closes: #14825

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 903205a..b65df5d 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5793,7 +5793,6 @@
 
     for (lnum = p1.lnum; lnum <= p2.lnum; lnum++)
     {
-	struct block_def	bd;
 	pos_T			ret_p1, ret_p2;
 
 	if (region_type == MLINE)
@@ -5805,11 +5804,28 @@
 	}
 	else
 	{
+	    struct block_def	bd;
+
 	    if (region_type == MBLOCK)
 		block_prep(&oa, &bd, lnum, FALSE);
 	    else
 		charwise_block_prep(p1, p2, &bd, lnum, inclusive);
-	    if (bd.startspaces > 0)
+
+	    if (bd.is_oneChar)  // selection entirely inside one char
+	    {
+		if (region_type == MBLOCK)
+		{
+		    ret_p1.col = bd.textcol;
+		    ret_p1.coladd = bd.start_char_vcols
+					     - (bd.start_vcol - oa.start_vcol);
+		}
+		else
+		{
+		    ret_p1.col = p1.col + 1;
+		    ret_p1.coladd = p1.coladd;
+		}
+	    }
+	    else if (bd.startspaces > 0)
 	    {
 		ret_p1.col = bd.textcol;
 		ret_p1.coladd = bd.start_char_vcols - bd.startspaces;
@@ -5819,7 +5835,13 @@
 		ret_p1.col = bd.textcol + 1;
 		ret_p1.coladd = 0;
 	    }
-	    if (bd.endspaces > 0)
+
+	    if (bd.is_oneChar)  // selection entirely inside one char
+	    {
+		ret_p2.col = ret_p1.col;
+		ret_p2.coladd = ret_p1.coladd + bd.startspaces;
+	    }
+	    else if (bd.endspaces > 0)
 	    {
 		ret_p2.col = bd.textcol + bd.textlen + 1;
 		ret_p2.coladd = bd.endspaces;