2011-08-11 107 views
0

在我的應用程序中,我從Twitter上讀取推文,但推文不受語言限制。因此,當我嘗試發送中/日推文的回覆時,內容無法正確顯示。我目前在發送迴應之前設定了處理多種語言編碼

response.setContentType("text/html;charset=UTF-8"); 

我們該如何處理多種語言?

我可以看到該消息發送

{ 「lastPost」:{ 「LASTUPDATE」: 「毋成金口」, 「pubdate的」: 「星期五年08月12 0點39分09秒UTC 2011」,」 MESSAGE_ID「:101814948329562112}

這是一個JSON字符串,並添加到響應..在我的客戶即iphone

的lastpost是 」????「

+1

爲什麼不編碼的信息發到Twitter本身是UTF-8,所以你只有一個編碼?就我所知,我認爲你不能在http站點中更改編碼本身。 – Voo

+0

你確定你正在捕獲用戶輸入嗎?你在另一端看到了什麼?用示例用戶輸入和顯示輸出更新問題。 – alphazero

回答

1

告訴瀏覽器該頁面是UTF-8是一件好事,但除非確保實際上只在頁面中編寫UTF-8,否則無用。

爲了確保這種情況發生:

  1. 當你閱讀時,從Twitter或什麼的,總是需要UTF-8的數據,請確保您收到UTF-8字節。
  2. 當你從原始字節創建一個字符串時,默認情況下Java使用「平臺默認編碼」,它可以是任何東西。字節到字符串的轉換髮生在從字節數組創建新字符串或使用Reader時。這兩種方法都允許你明確地定義你期望字節的入口。一旦檢查了點1並且您正在接收UTF-8 byes,請確保在您將應用程序中的任何位置指定爲在將字節轉換爲字符串時使用UTF-8。
  3. 當使用Writer將字符串轉換爲例如發送給瀏覽器(servlet writer)的字節時,應用相同的規則:嘗試明確並始終指定UTF-8
  4. 如果將東西存儲在數據庫中,那麼你有兩個編碼問題。第一個是你的數據庫與你的應用程序連接時使用的(連接編碼),第二個是數據庫實際存儲字符串的編碼(存儲編碼)。通常,您只能指定Java中的連接編碼,而在數據庫中指定存儲編碼時(如果您使用的是mysql,請搜索「整理」)。

檢測到應該是UTF-8的字符串被嚴重重新編碼的位置是一項艱鉅的任務。 99%的時間,它被轉換爲ISO-latin或類似的編碼,導致像à或ì這樣的特殊字符出現爲兩個垃圾字符。通常調試是瞭解發生這種情況的唯一方法。

+0

爲了使2和3更具體,'new InputStreamReader(stream,encoding)'是好的,但'new InputStreamReader(stream)'和'new FileReader(file)'不好。同樣,'新的OutputStreamWriter(流,編碼)'是好的,但'新的OutputStreamWriter(流)'和'新的FileWriter(文件)'是不好的。如果您試圖在代碼中使用默認編碼的所有位置,那麼對這些模式進行grep處理是收集低懸的成果的好方法。 –

+0

當我嘗試使用Chrome擴展檢索郵件時,它的工作正常......我想這可能是iPhone客戶端問題.. – harshit

+0

@Mike:您不能使用該構造函數的形式!只有四個中最長的一個纔可用!否則,你將無法檢測到編碼錯誤。在[本頁](http://training.perl.com/OSCON2011/index.html)的第三場演講中,請看第43張幻燈片,瞭解正確的方法。輸入流讀取器需要第二個構造器參數「Charset.forName(」UTF-8「)。newDecoder()',輸出流編寫器需要Charset.forName(」UTF-8「)的第二個參數newEncoder() '。 – tchrist

0

的問題是與客戶端編碼..它被設置爲異