2012-09-28 7 views
7

Ho bisogno di convertire (in Python) un carattere di 4 byte in un altro carattere. Questo è per inserirlo nel mio database mysql utf-8 senza ottenere un errore come: "Valore stringa errato: '\ xF0 \ x9F \ x94 \ x8E' per colonna 'riga' nella riga 1"Python, converte il carattere di 4 byte per evitare l'errore MySQL "Valore stringa errato:"

Warning raised by inserting 4-byte unicode to mysql mostra a fare in questo modo:

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

Tuttavia, ottengo lo stesso errore come l'utente nel commento, "... intervallo di caratteri male .." questo è apparentemente perché il mio Python è un UCS-2 (non UCS -4) costruire. Ma poi non sono chiaro su cosa fare invece?

+0

E 'ancora un problema se si utilizza il set di caratteri [utf8mb4] (http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html) in MySQL? –

+0

Non sicuro. Sfortunatamente non riesco a modificare il set di caratteri del database. – user984003

risposta

15

In una build UCS-2, python utilizza 2 unità di codice internamente per ciascun carattere Unicode sul punto di codice \U0000ffff. Le espressioni regolari hanno bisogno di lavorare con quelli, così avresti bisogno di utilizzare la seguente espressione regolare per abbinare questi:.

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

Questa espressione regolare corrisponde a qualsiasi punto di codice codificato con una coppia di surrogati UTF-16 (vedi UTF-16 Code points U+10000 to U+10FFFF

per rendere questa compatibili con tutti Python UCS-2 e UCS-4 versioni, è possibile utilizzare un try:/except ad utilizzare uno o l'altro:

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

Dimostrazione in un UCS-2 pitone di costruzione:

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

Fantastico, funziona. Grazie. – user984003