2012-07-16 10 views
9

To jest mój kod po stronie serwera lub kod boczny Android. Ten kod działa poprawnie tylko w przypadku wiadomości w języku angielskim. Jeśli używam kart czarterowych Unicode, takich jak używaj języka arabskiego, to nic nie pokazuje zamiast arabskiego. W związku z angielską mieszanką arabskojęzyczną, pomija ona tylko arabskie czartery.Charaktery unicode z systemem Android GCM nie są odbierane

Uprzejmie daj mi rozwiązanie. Dzięki!

To jest mój kod 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; 
     } 
    } 

I to jest mój kod Android boczny że złapać wiadomość.

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

Nie jestem pewien, czy to jest odpowiedź i Nie jestem programistą C#. Ale w oparciu o to, co zrozumiałem, twój kod nie koduje ciągów. Na przykład 'http: //www.acom? Q = niektóre dane' jest nieprawidłowe. Musisz zakodować "niektóre dane", podając 'http: //www.acom? Q = some% 20data'. Chyba musisz również zakodować znaki arabskie. W pythonie użyłbym 'cgi.encode()' oraz w języku Java 'UrlEnconder.encode()'. Nie znam odpowiednika w C#. –

Odpowiedz

9

André Oriani ma ogólny pomysł na poprawkę. Mimo że wiadomość jest umieszczana w treści żądania, nadal wymaga zakodowania adresu URL.

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

należy zastąpić

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

trzeba będzie dodać odwołanie do system.Web w celu wykorzystania HttpUtility. Aby uzyskać więcej informacji, patrz URL Encoding using C#.

+0

jest coś takiego jak HTTPUtility dla java? – user1163234

+0

Ups! dzięki! dobry! – breceivemail

2

Czy rozważałeś użycie base64 do kodowania ciągu wysyłanego przez GCM? W ten sposób usuniesz wszystkie problemy z kodowaniem.

2

Oto co rozwiązać go dla mnie w Javie:

Po stronie serwera:

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

w aplikacji:

decodedMessage = URLDecoder.decode(message, "UTF-8"); 
Powiązane problemy