Python, convierte el carácter de 4 bytes para evitar el error de MySQL “Valor de cadena incorrecto:”

Necesito convertir (en Python) un char de 4 bytes en algún otro carácter. Esto es para insertarlo en mi base de datos utf-8 mysql sin obtener un error como: “Valor de cadena incorrecto: ‘\ xF0 \ x9F \ x94 \ x8E’ para columna ‘línea’ en la fila 1”

La advertencia generada al insertar unicode de 4 bytes en mysql muestra que se debe hacer de esta manera:

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

Sin embargo, recibo el mismo error que el usuario en el comentario, “… rango de caracteres incorrectos …” Esto aparentemente se debe a que Python es una comstackción UCS-2 (no UCS-4). Pero entonces no tengo claro qué hacer en su lugar?

En una comstackción UCS-2, python usa 2 unidades de código internamente para cada carácter Unicode sobre el punto de código \U0000ffff . Las expresiones regulares deben trabajar con ellas, por lo que necesitarías usar la siguiente expresión regular para que coincida con estas:

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

Esta expresión regular coincide con cualquier punto de código codificado con un par suplente UTF-16 (ver los puntos de Código UTF-16 U + 10000 a U + 10FFFF) .

Para hacer que esto sea compatible en las versiones Python UCS-2 y UCS-4, puede usar try: / except para usar uno u otro:

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

Demostración en una construcción python UCS-2:

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