Các ký tự Unicode trong các dải ô \ u0000- \ uD7FF và \ uE000- \ uFFFF sẽ có mã hóa 3 byte (hoặc ít hơn) trong UTF8. Phạm vi \ uD800- \ uDFFF dành cho UTF16 nhiều byte. Tôi không biết python, nhưng bạn có thể thiết lập một biểu thức chính quy để đối sánh bên ngoài các phạm vi đó.
pattern = re.compile("[\uD800-\uDFFF].", re.UNICODE)
pattern = re.compile("[^\u0000-\uFFFF]", re.UNICODE)
Chỉnh sửa thêm Python từ tập lệnh của Denilson Sá trong phần nội dung câu hỏi:
re_pattern = re.compile(u'[^\u0000-\uD7FF\uE000-\uFFFF]', re.UNICODE)
filtered_string = re_pattern.sub(u'\uFFFD', unicode_string)