Python, конвертировать 4-байтовый символ, чтобы избежать ошибки MySQL " неправильное строковое значение:"

Мне нужно преобразовать (в Python) 4-байтовый символ в какой-то другой символ. Это, чтобы вставить его в мою базу данных MySQL utf-8 без получения ошибки, такой как:"неправильное строковое значение: 'xF0x9Fx94x8E' для столбца 'line' в строке 1"

предупреждение, вызванное вставкой 4-байтового unicode в mysql показывает, сделать это таким образом:

>>> 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: '

однако, я получаю ту же ошибку, что пользователь в комментарии "...плохой характер.."Это, по-видимому, потому, что мой Python является сборкой UCS-2 (не UCS-4). Но тогда я не понимаю, что делать вместо этого?

1 ответов


в сборке UCS-2 python использует 2 единицы кода внутренне для каждого символа unicode над \U0000ffff кодовая точка. Регулярные выражения должны работать с ними, поэтому вам нужно использовать следующее регулярное выражение, чтобы соответствовать этим:

highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')

это регулярное выражение соответствует любой кодовой точке, закодированной суррогатной парой UTF-16 (см. кодовые точки UTF-16 от U + 10000 до U+10FFFF.

чтобы сделать это совместимым в версиях Python UCS-2 и UCS-4, Вы мог бы использовать try:/except использовать один или другой:

try:
    highpoints = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
    # UCS-2 build
    highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')

демонстрация на UCS-2 python build:

>>> import re
>>> highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
>>> example = u'Some example text with a sleepy face: \U0001f62a'
>>> highpoints.sub(u'', example)
u'Some example text with a sleepy face: '