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