Греческое арабское сообщение

Мне нужно отправить SMS с использованием Sinch API с арабским текстом. Мое SMS-сообщение содержит английский, арабский и цифровой номер.

Что я пробовал

  1. Я прочитал документацию для Sinch, но они не предоставили никакой подробной документации о том, как использовать UTF-16BE и кодировку заголовка при отправке этого сообщения.
  2. Я также связался с их службой поддержки, но они не предоставили подробного решения по этому поводу. И что бы они ни упоминали, ничего не получалось.

Ниже приведен код, который я пробовал

String arabicFormattedMessage = "Some English Text \n\n"+"رجى الاتصال بالامتثال التجاري وحماية المستهلك (ككب) من دائرة التنمية الاقتصادية في 12345678 لمزيد من التفاصيل، إذا لم يتم الاتصال في غضون 5 أيام عمل.";
jsonObject.put("message", arabicFormattedMessage );

String messageBody = new String(jsonObject.toString().getBytes(),"UTF-16BE");
String contentTypeHeader = "application/json; charset=UTF-16BE";

headers.put("authorization", base64AuthHeader);
headers.put("content-type", contentTypeHeader);
headers.put("x-timestamp", timeStampHeader);

//headers.put("encoding", "UTF-16BE"); Tried with and without this, but still not working. 

Ответ, который я получил

Sinch responseCode: 400
Sinch Response: message object is invalid. toNumber object is invalid.

Как указано в комментариях, ниже приведен рабочий пример только на английском языке:

 JSONObject jsonObject = new JSONObject();
 String formattedMessage = "some english message";
 jsonObject.put("message", formattedMessage );
 final String messageBody = jsonObject.toString();

 final String base64AuthHeader = "basic" + " " + base64AppDetails;
 String contentTypeHeader = "application/json; charset=UTF-8";
 final String timeStampHeader = DateUtil.getFormattedTimeString(new Date());

 headers.put("authorization", base64AuthHeader);
 headers.put("content-type", contentTypeHeader);
 headers.put("x-timestamp", timeStampHeader);

HTTP POST-запрос

 HttpClient.sendHttpPostRequest(url, messageBody, headers);

После успешного звонка я получаю идентификатор сообщения в ответ от Синча

1 ответ

Решение

Проблема в том, что какой бы внутренней строкой ни была ваша кодировка (в Java это всегда UTF-16), HttpClient.sendHttpPostRequest, вероятно, отправляет ее как UTF-8.
Так как DefaultHttpClient устарел, мы будем делать это правильно, используя HttpURLConnection. Возможно, вы захотите ознакомиться с документацией HttpURLConnection о том, как ее следует использовать в отношении аутентификации.

String arabicFormattedMessage = "Some English Text \n\n"+"رجى الاتصال بالامتثال التجاري وحماية المستهلك (ككب) من دائرة التنمية الاقتصادية في 12345678 لمزيد من التفاصيل، إذا لم يتم الاتصال في غضون 5 أيام عمل.";
jsonObject.put("message", arabicFormattedMessage );

URL url = new URL ("http://...");
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
try {
    urlConn.setDoInput (true);
    urlConn.setDoOutput (true);
    urlConn.setRequestProperty("Content-Type","application/json; charset=UTF-16");   
    urlConn.connect();  

    DataOutputStream out = new DataOutputStream(urlConn.getOutputStream ());
    out.writeBytes(URLEncoder.encode(jsonObject.toString(),"UTF-16"));
    out.flush ();
    out.close ();

    int responseCode = urlConnection.getResponseCode();
    InputStream in = new BufferedInputStream(urlConnection.getInputStream());
    readStream(in);
    } finally {
       urlConnection.disconnect();
    }
}

Если это не работает, вы также должны попробовать UTF-16BE или UTF-16LE без метки порядка байтов.

Другие вопросы по тегам