Als MySQL geen UTF-8-codes van 4 bytes of meer aankan, moet u alle Unicode-tekens boven codepunt \U00010000
uitfilteren; UTF-8 codeert codepunten onder die drempel in 3 bytes of minder.
Je zou daarvoor een reguliere expressie kunnen gebruiken:
>>> 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: '
Als alternatief kunt u de .translate()
gebruiken functie
met een toewijzingstabel die alleen None
. bevat waarden:
>>> nohigh = { i: None for i in xrange(0x10000, 0x110000) }
>>> example.translate(nohigh)
u'Some example text with a sleepy face: '
Het maken van de vertaaltabel zal echter veel geheugen in beslag nemen en enige tijd in beslag nemen om te genereren; het is waarschijnlijk niet de moeite waard omdat de reguliere expressiebenadering efficiënter is.
Dit alles veronderstelt dat je een UCS-4 gecompileerde python gebruikt. Als uw python is gecompileerd met UCS-2-ondersteuning, kunt u alleen codepunten gebruiken tot '\U0000ffff'
in reguliere expressies en je zult dit probleem nooit tegenkomen.
Ik merk op dat vanaf MySQL 5.5.3 de nieuw toegevoegde utf8mb4
codec
ondersteunt het volledige Unicode-bereik.