4

ブロードキャスト メッセージを GCM に投稿する役割を果たしている Google App Engine にデプロイされたサーブレットがあります。Android クライアントは、GCM からそのブロードキャスト メッセージを受信します。サーブレットは、次のスニペットで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 クライアントでは、クラス extends 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");

問題について何か考えがありますか?あなたの助けが必要です、ありがとう。

4

1 に答える 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");
于 2013-02-03T22:33:08.917 に答える