2012-07-16 29 views
9

これは私のサーバーサイドコードまたはアンドロイドサイドコードです。 このコードは、英語のメッセージに対してのみうまく機能しています。アラビア語のようなUnicodeチャーターを使用すると、アラビア語の代わりに何も表示されません。 英語のアラビア語のミックスの原因で、アラブの唯一のチャーターをスキップします。Android GCMのユニコード文字は受信されません。

私に優しく答えてください。 ありがとう!

これは私のC#のコード

private string SendNotification(string authstring, string id, string msg) 
    { 
     try 
     { 
      ServicePointManager.ServerCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => true; 
      WebRequest request = WebRequest.Create("https://android.googleapis.com/gcm/send"); 
      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; 

      request.Headers.Add(string.Format("Authorization: key={0}", authstring)); 
      string collaspeKey = Guid.NewGuid().ToString("n"); 
      string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, msg, collaspeKey); 
      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
      request.ContentLength = byteArray.Length; 
      Stream dataStream = request.GetRequestStream(); 
      dataStream.Write(byteArray, 0, byteArray.Length); 
      dataStream.Close(); 
      WebResponse response = request.GetResponse(); 
      dataStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(dataStream); 
      string responseFromServer = reader.ReadToEnd(); 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 

      return responseFromServer; 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

であり、これはメッセージをキャッチし、私のAndroidの側のコードです。

@Override 
protected void onMessage(Context context, Intent intent) {   
    String message = ArabicUtilities.reshape(intent.getExtras().getString("payload")); 
} 
+0

私はこれが答えである場合にはわからないと私はC#プログラマーではない。しかし、私があなたのコードを理解したことに基づいて、あなたは文字列をエンコードしていません。たとえば、「http://www.acom?q = some data」は無効です。あなたは '' http://www.acom?q = some%20data''を生成する "いくつかのデータ"をエンコードしなければなりませんでした。私はあなたもアラビア文字をエンコードする必要がありますね。 Pythonでは 'cgi.encode()'とJavaの 'UrlEnconder.encode()'を使います。私はC#で同等のことを知らない。 –

答えて

9

André Oriani は、一般的な修正方法があります。メッセージはリクエストの本文に配置されますが、依然としてエンコードされたURLを必要とします。

string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, msg, collaspeKey); 

あなたはHttpUtilityを使用するためにのSystem.Webへの参照を追加する必要があります

string postData = string.Format("registration_id={0}&data.payload={1}&collapse_key={2}", id, HttpUtility.UrlEncode(msg), HttpUtility.UrlEncode(collaspeKey)); 

に置き換える必要があります。詳細については、URL Encoding using C#を参照してください。

+0

Java用のHTTPUtilityのようなものがありますか? – user1163234

+0

おっと!ありがとう!良い! – breceivemail

2

GCMで送信された文字列をbase64でエンコードすることを検討しましたか?この方法で、すべてのエンコーディングの問題を取り除きます。

2

はここで、Javaで私のためにそれを解決したものです:サーバー側で

:アプリで

encodedMessage = URLEncoder.encode(message, "UTF-8"); 

decodedMessage = URLDecoder.decode(message, "UTF-8"); 
関連する問題