2013-02-03 50 views
4

我在Google App Engine上部署了一個Servlet,它正在向GCM發送廣播消息。 Android客戶端將收到來自GCM的廣播消息。 Servlet使用以下代碼段擴展BaseServlet接收到的GCM消息顯示爲亂碼文本

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    //when receiving a gcm broadcast request, send message to GCM 
    Builder mb = new Message.Builder(); 
    mb.addData("message", "The message to send"); 
    Message message = mb.build(); 
    sender.sendNoRetry(message, regIds); 
    ... 
} 

當「發送的信息」是英文的時候,一切正常。但是,如果「發送的消息」被其他語言(如中文)取代,則Android客戶端將收到一串亂碼文本。在Android客戶端上,我使用擴展GCMBaseIntentService類來處理GCM廣播。

@Override 
protected void onMessage(Context context, Intent intent) { 

     String message = ""; 
     message = intent.getStringExtra("message")!=null ? intent.getStringExtra("message") : ""; 
     doNotify(message); 
} 

我試圖重新編碼郵件,但不起作用。

message = new String(message.getBytes("ISO-8859-1"), "UTF-8"); 

對這個問題有什麼想法?我需要你的幫助,謝謝。

回答

7

嘗試URLEncoder

mb.addData("message", URLEncoder.encode("世界","UTF-8"); 

另一種選擇:

mb.addData("message", new StringEntity("世界", "UTF-8"); 

看着GCM的源代碼後:com.google.android.gcm.server.Sender,這是期運用HttpPost爲JSON ,並且Java在內部使用UTF-16,所以在發佈之前,您需要對其進行正確編碼。
正如評論所說,在客戶端解碼字符串

String yourAwesomeUnicodeString=URLDecoder.decode(intent.getStringExtra("message"),"UTF-8"); 
+0

謝謝,它真正的幫助。在客戶端,它需要執行URLDecoder.decode()。 –

+0

沒問題。我添加了你的評論來回答他人的幫助。 – wtsang02

+0

這解決了我的問題, - URLEncoder&URLDecoder非常有幫助的類! – EsmaeelQash

相關問題