在文本的處理中,無論是網路上抓取的資料,還是由實際資料轉換而來的文本,已結構化處理的資料我都習慣放至資料庫中儲存和管理。一直以來都很習慣的使用 PHP 語言來做資料的整理和處理,一方面是因爲最熟悉這個語言,一方面是 PHP 也可以很容易的做成網頁來呈現結果。 而有些近來處理的資料,需要經過中文斷詞(中文分詞)的處理,雖然 PHP 已有人發展出 SCWS 中文分詞工具,主要運用在 GBK 和 UTF-8 上,對於繁體中文的斷詞目前則不如其他工具來的好用。也因此我最近選擇了 Python 作爲文本處理的主要語言,使用 JieBa 這套斷詞工具(斷詞的細節在這裡我就不多琢磨)。以往 PHP 操作 MySQL 的方式現在要改成 Python 了,也還好 python 有 MySQLdb Library 來幫助操作。 在 PHP 中爲了避免 Single quote 或是 double quote 等特殊字元可能造成 SQL injection,多半會使用 addslashes() 或 mysqli::real_escape_string() 函數來事先處理。而在 python 的 MySQLdb 中也有雷同的函數 MySQLdb.escape_string() 可是使用來跳脫特殊字元,我所處理的文本資料是 utf-8 編碼,在第一次使用就出現了如下的錯誤訊息: MySQLdb.escape_string(sql) UnicodeEncodeError: 'ascii' codec can't encode character... 讓我傷透了腦筋以爲是 unicode 造成的問題,陸續找了其他像 replace 或 regular expression 的方式來替換,也試過字串以參數代入的方式,但都無法盡善盡美。 最後我又回到了這個錯誤訊息,錯誤訊息總是會有解答的 Hint :)。 原來 MySQLdb.escape_string() 試圖將 query 的內容 encode 成字串,預設使用的 encode 編碼是 ascii,而我們所使用的 query 無法被 encode 成 ascii 而產生錯誤。所以我們 必須告訴 MySQLdb 要使用的編碼是 utf-8 ,方法如下: MySQLdb.escape_s