Decode a UTF-8 string to character byte counts
Python 3, 135 bytes



def f(b):
&#9;B=b.decode(errors="ignore")[:1].encode();l=len(B)
&#9;if B and b[:l]!=B:return"�"+f(b[1:])
&#9;return str(l)+f(b[l:])if b else''


Try it online!

Explanation:

def f(b):
&#9;B=b.decode(errors="ignore")[:1].encode();l=len(B)
&#9; # B is the UTF-8-encoded version of the first Unicode character in the given bytes
&#9; # (Or the Nth, if the first N-1 bytes were invalid Unicode bytes)
&#9;if B and b[:l]!=B:return"�"+f(b[1:])
&#9; # If the two encoded byte-strings don't match,
&#9; # then the first byte in b is invalid,
&#9; # so append "�" to the returned string, and recurse
&#9;return str(l)+f(b[l:])if b else''
&#9; # If the byte-string is not empty,
&#9; #  append the length of the first character and recurse.
&#9; # Else (the input is empty) return the empty string (recursion base case)