Could we get a proper diff (rather than question marks) if we fall back to `source.encode(string.encoding)`, and then, if that fails, fall back to this?

Given your example (korean characters in UTf-8 and latin characters in US-ASCII), you should be able to get a diff if you convert the US-ASCII latin characters to UTF-8, right?