[英]utf-8 invisible characters
我有一個網站,需要將文本字段中的數據存儲到mysql數據庫中。 前端是perl。 我使用utf8::encode
將數據編碼為utf8。
向連接到mysql db並插入此文本的Java后端發出請求。 對於該表,默認字符集設置為utf8。 這在許多情況下都有效,但在某些情況下會失敗。
如果我使用テスト
,存儲在數據庫中的數據顯示問號: ã??ã?¹ã??
。 如果我嘗試直接從sql瀏覽器插入utf8編碼的字符串,則一切正常。 更新事件集摘要= ãã¹ã
其中event_id = 11657
;
插入時,我注意到mysql查詢瀏覽器中顯示了一些空白字符,例如: ã ã¹ ã
。 從此處插入后,數據庫中的數據將顯示數據庫中的某些方框而不是這些空格,並且在utf8解碼后, テスト
會正確顯示在網站上。 問題是只有當我直接從網站插入時,這些特殊字符才會作為問號出現在數據庫中。
有人可以幫我這些特殊字符嗎? 我需要以不同的方式處理它們嗎?
我們在其中一個項目中也遇到過類似的問題,因此我們不得不編寫一個小例程將utf8
字符轉換為html encoded
並存儲到數據庫中。
使用來自Apache Commons Lang的 StringEscapeUtils :
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);
如果數據庫確實存儲了テスト
,那么您應該在sql瀏覽器中看到它而不是mojibake。
聽起來Java后端正在解釋Perl發送的是ISO-8859-1而不是UTF-8。 這就解釋了怎么樣了テ
被轉換成\ã\\
。 然后,后端嘗試將數據發送到Windows-1252(MySQL默認編碼)中的數據庫。 不幸的是,Windows-1252無法表示\\ u0080- \\ u009F范圍內的Unicode字符,因此最后兩個字符被問號代替。
因此,您有兩個問題:
characterEncoding=utf8
添加到連接參數 。 我假設您正在發送POST參數。
我認為最有可能引起您最初問題的原因之一是:
如果參數是在HTTP請求正文中發送的,則您的Perl前端可能未在請求的內容類型標頭中設置編碼。 網絡服務器可能采用ISO-8859-1。 解決方案是正確設置請求內容類型。
如果參數是通過HTTP請求URL發送的,則您的Web服務器在解碼請求參數時使用了錯誤的字符集。 解決方案將是特定於Web服務器的...
聽起來好像在與數據庫對話時也可能存在字符集問題,但這可能只是更早進行操作的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.