A string consists of a series of UTF-8 sequences. All UTF-8 sequences:
EITHER consist of exactly one octet (byte to you and me) with the top bit clear
OR consist of one octet with the two topmost bits set, followed by one or more octets with bit 7 set and bit 6 clear.
See http://en.wikipedia.org/wiki/Utf8#Description for details.
So what you need to do is to check whether the character concerned has bit 7 set and bit 6 clear, and if so step back one, taking care not to go beyond the start of the string (note that if the string is well formed, this won't happen).
Untested C-ish pseudocode:
char *
findPrevious (const char *ptr, const char *start)
{
do
{
if (ptr <= start)
return NULL; /* we're already at the start of the string */
ptr--;
} while ((*ptr & 0xC0) == 0x80);
return ptr;
}