Unicode-tecken i intervallen \u0000-\uD7FF och \uE000-\uFFFF kommer att ha 3 byte (eller mindre) kodningar i UTF8. \uD800-\uDFFF-intervallet är för multibyte UTF16. Jag kan inte python, men du bör kunna ställa in ett reguljärt uttryck för att matcha utanför dessa intervall.
pattern = re.compile("[\uD800-\uDFFF].", re.UNICODE)
pattern = re.compile("[^\u0000-\uFFFF]", re.UNICODE)
Redigera lägger till Python från Denilson Sás skript i frågekroppen:
re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
filtered_string = re_pattern.sub(u'\uFFFD', unicode_string)