Nếu MySQL không thể xử lý các mã UTF-8 từ 4 byte trở lên thì bạn sẽ phải lọc ra tất cả các ký tự unicode qua codepoint \U00010000
; UTF-8 mã hóa điểm mã dưới ngưỡng đó trong 3 byte trở xuống.
Bạn có thể sử dụng một biểu thức chính quy cho điều đó:
>>> import re
>>> highpoints = re.compile(u'[\U00010000-\U0010ffff]')
>>> example = u'Some example text with a sleepy face: \U0001f62a'
>>> highpoints.sub(u'', example)
u'Some example text with a sleepy face: '
Ngoài ra, bạn có thể sử dụng .translate()
chức năng
với một bảng ánh xạ chỉ chứa None
giá trị:
>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '
Tuy nhiên, việc tạo bảng dịch sẽ tốn rất nhiều bộ nhớ và mất một khoảng thời gian để tạo; nó có thể không đáng để bạn nỗ lực vì phương pháp biểu thức chính quy hiệu quả hơn.
Tất cả điều này giả định rằng bạn đang sử dụng một python được biên dịch UCS-4. Nếu python của bạn được biên dịch với hỗ trợ UCS-2 thì bạn chỉ có thể sử dụng mã điểm tối đa '\U0000ffff'
trong biểu thức chính quy và bạn sẽ không bao giờ gặp phải vấn đề này ngay từ đầu.
Tôi lưu ý rằng kể từ MySQL 5.5.3, utf8mb4
codec
không hỗ trợ phạm vi Unicode đầy đủ.