簡體   English   中英

utf-8隱形字符

[英]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字符,因此最后兩個字符被問號代替。

因此,您有兩個問題:

  1. 您應該使Java后端以UTF-8而不是ISO-8859-1的形式讀取請求。
  2. 后端在與數據庫交談時應使用UTF-8。 最簡單的方法是將characterEncoding=utf8添加到連接參數

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

我認為最有可能引起您最初問題的原因之一是:

  1. 如果參數是在HTTP請求正文中發送的,則您的Perl前端可能未在請求的內容類型標頭中設置編碼。 網絡服務器可能采用ISO-8859-1。 解決方案是正確設置請求內容類型。

  2. 如果參數是通過HTTP請求URL發送的,則您的Web服務器在解碼請求參數時使用了錯誤的字符集。 解決方案將是特定於Web服務器的...

聽起來好像在與數據庫對話時也可能存在字符集問題,但這可能只是更早進行操作的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM