中文本體持久化到Mysql數據庫的亂碼問題

相信這應當不是個複雜的問題,但是困擾了我整整一個下午的時間,目前尚沒有解決。

畢設第一階段的工作大概可以說是完成了,進行了一些簡單的測試,目前比較明顯的問題是中文的支持。先寫下程序中數據的流動過程,然後再細想到底是哪個環節出了問題:

  • 首先考慮的是Protege,我用它來創建本體,在斯坦福的ProtegeFAQ看到Protege爲了便於共享,因此默認支持的UTF-8的編碼方式,而非根據系統而轉變。因此,這點無問題。同時,我也曾懷疑Protege在寫本體文件時候採用的是系統默認編碼方式而非UTF-8,但對生成的文件做了分析,確認是UTF-8無疑,到此,沒有任何問題,覺得到此是可以PASS的。
  • 第二步,將本體文件讀入內存,這裏已經確定有一個問題,讀取後的本體文件,中文顯示亂碼,我想大概的原因如下:在簡體中文的WindowsXP狀態下,Java的FileInputStream採用的GB2312方式編碼,而我在這裏調用的是Jena提供的API,OntModel.read(String url),這個url當然可以是一個file的,比如”file:sns.owl”。而Jena在提供的read方法在封裝FileInputStream時候顯然並不會去聲明UTF-8編碼方式,因此,這裏可以採用的解決方式如下:

     

    FileInputStream file = new FileInputStream(”test.owl”);
    InputStreamReader in = new InputStreamReader(file, “UTF-8″);
    Model model = ModelFactory.createDefaultModel();
    model.read(in, null);
    in.close();

    顯式的聲明採用UTF-8編碼讀應該就可以了。這個問題不是重點。

  • 第三,將獲得的本體文件加入一些實例然後一起存入數據庫,其中實例中有些地方中出現了中文。這裏有三個地方可能會出現問題,首先是java代碼的編輯器,eclipse在簡體中文WindowsXP下采用了非UTF-8編碼方式,這個目前已經fix了,第二個地方是jdbc將數據寫入數據庫的時候,由於程序中採用的是Jena提供的DBConnection類封裝了jdbc操作,這個地方目前沒有測試,準備放棄掉這個封裝做個測試。第三個地方就是數據庫的編碼了,我這裏已經採用的mysql,已經將相關的數據庫和表都設成UTF-8了,目前看來,可能出問題的似乎只有jdbc這塊了。
  • 最後,要說的是,如果是在linux下開發的話,這一切是不是都沒有問題了?

昨天的困擾我的問題,今天上午基本上算是解決了。要在簡體中文windows xp中沒有後顧之憂的處理中文本體基本上要做以下幾個步驟:

  1. 建立本體的時候請採用UTF-8編碼,假使是用protege生成的,較新的版本應當是沒有問題,老版本的話默認編碼可能不是UTF-8(而是根據操作系統設置),請務必確認下。
  2. 應當以UTF-8編碼方式來編寫Jave Code。無論是eclipse,還是普通的文本編輯器,都可以輕鬆的解決這個問題的。
  3. 存本體的數據庫字符集應當是UTF-8。具體方法可以查詢相關文檔,不廢話了。
  4. 最後,用jdbc連數據庫(mysql)的時候 ,在DB_URL後需要加上”useUnicode=yes&characterEncoding=utf8″,否則,中文編碼可能會無法識別,而以?的形式存入數據庫。

轉自:http://hi.baidu.com/ecgql/blog/item/534dc25459e7b75dd0090678.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章