In Python 2, Unicode strings may contain both unicode and bytes:
No, they may not. They contain Unicode characters.
Within the original string,
\xd0 is not a byte that’s part of a UTF-8 encoding. It is the Unicode character with code point 208.
u'\u00d0'. It just happens that the
repr for Unicode strings in Python 2 prefers to represent characters with
\x escapes where possible (i.e. code points < 256).
There is no way to look at the string and tell that the
\xd0 byte is supposed to be part of some UTF-8 encoded character, or if it actually stands for that Unicode character by itself.
However, if you assume that you can always interpret those values as encoded ones, you could try writing something that analyzes each character in turn (use
ord to convert to a code-point integer), decodes characters < 256 as UTF-8, and passes characters >= 256 as they were.