2012-09-28 15 views
7

我需要將(以Python)4字節的字符轉換爲其他字符。這是將其插入到我的UTF-8 mysql數據庫沒有得到一個錯誤,如:「不正確的字符串值:在第1行‘\ XF0 \ x9F \ X94 \ x8E’列‘線’」Python,轉換4個字節的字符以避免MySQL錯誤「不正確的字符串值:」

Warning raised by inserting 4-byte unicode to 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)構建。但是,我不清楚該怎麼做呢?

+0

是否仍是一個問題,如果你在MySQL中使用的[utf8mb4(http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)字符集? –

+0

不確定。不幸的是,我不能改變數據庫的字符集。 – user984003

回答

15

在UCS-2構建中,python在內部針對\U0000ffff代碼點上的每個unicode字符使用2個代碼單元。正則表達式必須與那些工作,所以你需要使用下面的正則表達式匹配這些:

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

這個正則表達式用UTF-16代理對編碼的任何代碼點一致(見UTF-16 Code points U+10000 to 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構建演示:

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

真棒,這個工程。謝謝。 – user984003

相關問題