收到的GCM消息显示为乱码文本

4

我在Google App Engine上部署了一个Servlet,它的作用是向GCM发布广播消息。Android客户端将从GCM接收该广播消息。该Servlet扩展了BaseServlet,以下是代码片段:

@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");

有关这个问题有什么想法吗?我需要你的帮助,谢谢。
1个回答

8
尝试 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");

谢谢,这真的很有帮助。在客户端,需要执行URLDecoder.decode()。 - Shawn Lu
没问题。我已将你的评论添加到答案中以帮助其他人。 - wtsang02
这解决了我的问题,谢谢wtsang,URLEncoder和URLDecoder非常有用的类! - EsmaeelQash
我尝试了完全相同的事情,但仍然不起作用。有什么想法吗? - Gokhan Arik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接