1. 程式人生 > >服務端儲存特殊字元解決方案

服務端儲存特殊字元解決方案

       最近在專案中遇到一個問題,服務端在向資料庫插入資料時報錯:Error updating database.  Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8A' for column 'msg' at row 1。在網上搜了很多,找到無非是更換資料庫字符集之類的,但是試了好像沒有效果,有的地方說更換字符集後需要重啟資料庫(暫時還沒有驗證)。

        後來在又看到其他地方講了一個方法,試了可行,先記錄在此:

/**
 * 字串與unicode的相互轉換工具類
 * @author Xinx.
 * @date 2018/11/5 17:57
 */
public class UnicodeConvertUtil {

    /**
     * 將字串轉成unicode
     * @param string 待轉字串
     * @return 普通字串
     */
    public static String string2Unicode(String string) {
        StringBuffer unicode = new StringBuffer();
        for (int i = 0; i < string.length(); i++) {
            // 取出每一個字元
            char c = string.charAt(i);
            // 轉換為unicode
            unicode.append("\\u" + Integer.toHexString(c));
        }
        return unicode.toString();
    }

    /**
     * 將unicode轉成字串
     * @param unicode 待轉字串
     * @return unicode字串
     */
    public static String unicode2String(String unicode) {
        if (unicode.indexOf("\\u") == -1)//如果不是unicode碼則原樣返回
            return unicode;

        StringBuffer string = new StringBuffer();
        String[] hex = unicode.split("\\\\u");
        for (int i = 1; i < hex.length; i++) {
            // 轉換出每一個程式碼點
            int data = Integer.parseInt(hex[i], 16);
            // 追加成string
            string.append((char) data);
        }
        return string.toString();
    }
}

      大致的原理就是拿到前端傳來的資料後,現將資料轉換成unicode字串,存入資料庫。資料取出來時,再將unicode轉回去。儘管方法low了一點,但是也解決了專案中,目前所遇到的問題。倘若後面驗證了修改字符集後重啟資料庫可行的話,還是會使用更換資料庫字符集的方案,畢竟這種特殊字元在很多地方都會出現,每一次都特殊處理很麻煩。