2015年1月19日 星期一

Python過濾4 byte unicode字

前一陣子收到了專案的Error信件,內容有一個錯誤訊息是這樣子的:
Warning: Incorrect string value: '\xF0\x9F\x98\x82\xE6\x9D...' for column 'nickname' at row 1
原來是我們QA在輸入暱稱的時候輸入了一些Emoji的表情符號,以前使用iPhone的時後有安裝過這樣的應用程式,還以為是什麼神奇的功能,原來這些表情符號是被建立在4 byte 區段的unicode字元。

但在網路上Google後的結果,是舊版的MySQL沒有完整支援utf8字元的問題。所以4 byte的unicode字要塞進資料庫會有一點問題。
查了幾篇文章,都是建議我們將資料庫的編碼格式改為utf8mb4,可是我們目前測試環境內使用的是古早的MySQL 5.1版本, 似乎不支援utf8mb4。而且改動這個工程太大了,後來我們索性把這些字元過濾掉,不讓User輸入就一了百了了。程式的實作如下列所述:

不過在正規表示式上,還有UCS-2和UCS-4 Build的問題,所以要做一個try...catch...的處理。

參看:
  1. MySQL with utf8mb4
  2. Python, convert 4-byte char to avoid MySQL error “Incorrect string value

沒有留言:

張貼留言