2011-06-15 104 views
0

我正在寫一個Python腳本,它讀取推文並將它們插入到MySQL中。根據每條推文的屬性,我需要插入不同的字段。出於這個原因,我正在創建的查詢字符串的字段和值部分,因爲我去,使用Python字符串格式化爲方便:Python字符串格式化UnicodeEncodingError

values = """%s, %s, '%s','%s','%s','%s',%s,'%s','%s','%s'""" % (
       url_id, tweet['from_user_id'], conn.escape_string(tweet['location']), 
       conn.escape_string(tweet['profile_image_url']), 
       tweet['created_at'], tweet['from_user'], tweet['id'], 
       conn.escape_string(tweet['text']), 
       conn.escape_string(tweet['iso_language_code']), conn.escape_string(tweet['source']) 
      ) 

當我這樣做與具有UTF8字符的鳴叫,不過,我得到這樣的錯誤:

values = """%s, %s, '%s','%s','%s','%s',%s,'%s','%s','%s'""" % (
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 117: ordinal not in range(128) 

我認爲格式字符串(帶有所有的「%s的」 S)被解釋爲默認ASCII,而這與UTF-8字符衝突。我需要將所有內容保存在UTF-8中,因爲此代碼必須使用任何可能的語言。

那麼如何指定格式化字符串是UTF-8?我想我可以改變整個腳本的默認編碼,但是我使用的是Python 2.4,並且該版本中不存在sys.setdefaultencoding。現在,我只是不知道該怎麼做,或者即使這是正確的做法。

+0

是的...這是一個['unicode',不是UTF-8](http://farmdev.com/talks/unicode/)。 – 2011-06-15 03:12:55

+0

我希望python3很快成爲現狀...... Unicode FTW。順便說一句Py2.4是太老了 – JBernardo 2011-06-15 03:21:36

+0

阿門到...我沒有選擇2.4。我工作的所有服務器仍然停留在它上面。 – 2011-06-15 03:23:30

回答

3

變化:

"""%s, %s, '%s','%s','%s','%s',%s,'%s','%s','%s'""" 

到:

u"""%s, %s, '%s','%s','%s','%s',%s,'%s','%s','%s'""" 

,然後如果你想將它編碼成UTF-8,這樣做:

value.encode('utf8') 

但它看起來像你」無論如何重新使用錯誤的方法,請參閱Escape string Python for MySQL

+0

謝謝!其實,我早些時候嘗試過,而且我仍然得到同樣的錯誤。它仍然嘗試使用ASCII編碼所有內容。 – 2011-06-15 03:20:03

+0

所以錯誤*完全相同? – 2011-06-15 03:22:15

+0

沒有 - 好點。現在它的值爲:%s,%s,'%s','%s','%s','%s',%s,'%s','%s','%s ''「」%( UnicodeEncodeError:'ascii'編解碼器無法編碼81-82位置的字符:序號不在範圍內(128) – 2011-06-15 03:25:30