2012-07-16 51 views
9

這是我的服務器端代碼或android端代碼。 此代碼僅適用於英文消息。如果我像使用阿拉伯語一樣使用Unicode章程,那麼它不會顯示阿拉伯語。 由於英文阿拉伯文混合,它跳過唯一的阿拉伯章程。Android GCM unicode字符沒有收到

請給我解決方案。 謝謝!

這是我的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 =某些數據'無效。你必須對產生「http://www.acom?q = some%20data」的「某些數據」進行編碼。我想你也必須編碼阿拉伯字符。在python中,我會使用'cgi.encode()'和Java'UrlEnconder.encode()'。我不知道C#中的等價物。 – 2012-08-03 04:53:41

回答

9

André Oriani 有修復的一般想法。即使該消息放置在請求的主體中,它仍然需要進行url編碼。

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

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

您需要才能使用HttpUtility添加的System.Web的引用來代替。有關更多信息,請參閱URL Encoding using C#

+0

有沒有像HTTPUtility這樣的Java? – user1163234 2012-11-18 20:22:50

+0

糟糕!謝謝!好! – breceivemail 2013-08-11 04:54:05

2

您是否考慮過使用base64對通過GCM發送的字符串進行編碼?這樣你將刪除所有的編碼問題。

2

下面是在Java中解決了這個問題對我來說:

在服務器端:

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

在應用程序中:

decodedMessage = URLDecoder.decode(message, "UTF-8");