2010-01-05 74 views
0

我想從UTF-8編碼的網站獲取數據並將它們插入到數據庫(MYSQL)中。數據庫也以UTF-8編碼。在java中的UTF-8編碼,從網站檢索數據

這是我用來從特定網站下載數據的方法。

public String download(String url) throws java.io.IOException { 
     java.io.InputStream s = null; 
     java.io.InputStreamReader r = null; 
     StringBuilder content = new StringBuilder(); 
     try { 
      s = (java.io.InputStream)new URL(url).getContent(); 

      r = new java.io.InputStreamReader(s, "UTF-8"); 

      char[] buffer = new char[4*1024]; 
      int n = 0; 
      while (n >= 0) { 
       n = r.read(buffer, 0, buffer.length); 
       if (n > 0) { 
        content.append(buffer, 0, n); 
       } 
      } 
     } 
     finally { 
      if (r != null) r.close(); 
      if (s != null) s.close(); 
     } 
     return content.toString(); 
    } 

如果編碼設置爲 'UTF-8'(R =新java.io.InputStreamReader中(S, 「UTF-8」);)插入到數據庫中的數據似乎看上去正常,但是當我嘗試展示它,我得到了這樣的東西:科特迪瓦,而不是科特迪瓦。

我的所有網站都以UTF-8編碼。

請幫助。如果編碼設置爲「windows-1252」(r = new java.io.InputStreamReader(s,「windows-1252」);),一切正常,我在我的網站()上獲得科特迪瓦(Côted'Ivoire) ,但在java中,這個標題看起來像'C''科特迪瓦'什麼打破了其他的東西,比如鏈接。這是什麼意思 ?

回答

1

對於服務器,客戶端和連接,您的數據庫編碼是否設置爲UTF-8,並且是否使用該編碼創建了表?查詢 '顯示變量' 和如果編碼被設置爲 'UTF-8' '顯示創建表<one-of-the-tables>'

+0

字符集客戶端:utf8;字符集連接:utf8;字符集數據庫:latin1;字符集文件系統:二進制;字符集結果:utf8;字符集服務器:latin1;字符集系統:utf8; – Martin 2010-01-05 10:33:46

+0

那麼,你有它。您的服務器存儲的數據爲「latin1的」(除非您在創建表時專門設置「utf-8」。你需要設置服務器的字符集「(它實際上是一個字符編碼,但我們不要進入現在)爲utf8作爲好。 – Confusion 2010-01-05 11:24:54

2

的Java

的問題似乎在於在HttpServletResponse,如果你有一個servlet或JSP頁面。確保將您的HttpServletResponse編碼設置爲UTF-8。

在JSP頁面或doGet或Servlet的doPost,之前的任何內容發送到響應,只是做:

response.setCharacterEncoding("UTF-8"); 

PHP

在PHP中,嘗試使用從數據庫中檢索後的utf8-encode函數。

+0

我使用的PHP/Apache和YES,我設置編碼UTF-8: 頭( '內容 - 類型:文本/ HTML;字符集= UTF-8'); – Martin 2010-01-05 10:08:43

+0

請注意,設置標題並不意味着設置編碼。你應該在你的問題中指定你正在使用PHP/apache,因爲你的java代碼使這個模糊不清。 – glmxndr 2010-01-05 10:10:44

+2

您也需要在編寫代碼時定義編碼,不知道這是如何在PHP中工作的,但是您在註釋中設置的內容僅僅是關於客戶端應該如何解釋內容流的說明。 – Tomas 2010-01-05 10:10:52

6

我會考慮使用公共-io的,他們有一個功能做你想做的事:link

與此替換代碼:

public String download(String url) throws java.io.IOException { 
    java.io.InputStream s = null; 
    String content = null; 
    try { 
     s = (java.io.InputStream)new URL(url).getContent(); 
     content = IOUtils.toString(s, "UTF-8") 

    } 
    finally { 
     if (s != null) s.close(); 
    } 
    return content.toString(); 
} 

如果窮人做開始尋找到如果你可以將它存儲到正確的文件,以消除你的數據庫設置不正確的可能性。

+0

數據庫編碼:UTF-8的Unicode(UTF-8),所有表都在UTF-8(ENGINE = MyISAM的默認字符集= UTF8) – Martin 2010-01-05 10:10:44

+0

嘗試使用代替commonsIO http://commons.apache.org/io/ 那轉換你在第一篇文章中的做法。你會得到一個班輪。 – Tomas 2010-01-05 10:12:00

+0

對我來說就像一個魅力!謝謝! – 2015-11-24 16:50:01

1

(R =新java.io.InputStreamReader中(S, 「UTF-8」);)數據插入數據庫似乎看起來不錯,但是當我嘗試顯示它時,我得到了這樣的情況:科特迪瓦,而不是科特迪瓦。

因此,在編碼顯示是錯誤的。你如何顯示它?根據評論,這是一個PHP頁面?如果是這樣,那麼你需要考慮兩件事:

  1. 把它們寫到HTTP響應輸出使用相同的編碼,因此UTF-8
  2. 將內容類型設置爲UTF-8,以便網頁瀏覽器知道使用哪種編碼來顯示文本。

按照該意見,你顯然已經做了2留守1,在PHP中您需要安裝mb_string並設置mbstring.http_outputUTF-8爲好。我發現this cheatsheet非常有用。