2012-06-05 36 views
1

我有一個網站,需要將數據從文本字段存儲到mysql數據庫中。 前端是perl。我用utf8::encode將數據編碼爲utf8。utf-8隱形字符

該請求是對連接到mysql db並插入此文本的Java後端進行的。 對於表,默認字符集設置爲utf8。 這在很多情況下都有效,但在某些情況下會失敗。

如果我使用テスト,存儲在數據庫中的數據顯示問號:ã??ã?¹ã??。 如果我試圖直接從sql瀏覽器插入utf8編碼的字符串,一切工作正常。 更新事件集彙總= ãã¹ã其中event_id = 11657;

插入時,我注意到有一些空白字符出現在mysql查詢瀏覽器中,如:ã ã¹ ã。 從這裏插入後,數據庫中的數據會顯示數據庫中的一些框,而不是這些空格,並且在utf8對其進行解碼後,網站會正確顯示テスト。 只有當我直接從網站插入時,這些特殊字符纔會出現在數據庫中的問號。

有人能幫我這些特殊字符嗎?我需要以不同的方式處理它們嗎?

+0

聽起來像數據流的某處存在編碼問題。很難說在沒有任何關於實際代碼的知識的情況下,但Java中常見的罪魁禍首是使用'String.getBytes()'(不帶編碼參數)。另一種可能性是在通信網頁時編碼問題。 –

+1

-1 downvote for [提供代碼](http://sscce.org),沒有人可以實際[重現問題](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html #showow),並且所有的答案(到目前爲止4)都充滿了假設。英文散文是代碼的一個可憐的替代品。 – daxim

回答

0

我們在其中一個項目中也遇到了類似的問題。所以我們不得不編寫一個小例程來將這些utf8字符轉換爲html encoded並存儲到數據庫中。

0

使用StringEscapeUtilsApache Commons Lang

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml; 
// ... 
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML"; 
String escaped = escapeHtml(source); 
0

如果數據庫存儲真正テスト,這是你應該在SQL瀏覽器,而不是變爲亂碼看什麼。

聽起來像Java後端正在解釋什麼Perl發送爲ISO-8859-1而不是UTF-8。這說明如何將轉換爲\u00E3\u0083\u0086。然後後端嘗試將數據發送到Windows-1252中的數據庫 - MySQL默認編碼。不幸的是,Windows-1252不能代表\ u0080- \ u009F範圍內的Unicode字符,所以最後兩個字符被替換爲問號。

所以,你有兩個問題:

  1. 你應該把Java後端讀取UTF-8的請求,而不是ISO-8859-1。
  2. 後臺應該在與數據庫交談時使用UTF-8。最簡單的方法是將characterEncoding=utf8添加到connection parameters
0

我假設你正在發送POST參數。

我認爲你最初的問題的最可能的原因是下列之一:

  1. 如果參數在HTTP請求主體發送,你的Perl前端可能不是設置編碼在請求的內容類型頭部中。網絡服務器可能會假設ISO-8859-1。解決方法是正確設置請求內容類型。

  2. 如果在HTTP請求URL中發送參數,則在解碼請求參數時,Web服務器使用錯誤的字符集。這個問題的解決將會是Web服務器特定...

聽起來好像也有可能是聊到數據庫中的字符集問題,但是這可能只是早期的mangling的結果。