отправь арабские смс на мобильный в java - PullRequest
1 голос
/ 15 ноября 2010

в моем приложении есть поддержка арабского и английского языков, но я сталкиваюсь с проблемой, когда мобильный телефон получает арабские смс, которые отображаются как ??? ???? (вопросительные знаки) зная, что монбайл, который я использую для тестирования, поддерживает арабский язык, и весь арабский язык в приложении работает нормально, проблема заключается только в том, что на мой мобильный телефон приходит арабское SMS.

String ff = new String(smsContent.getBytes("UTF-8"), "UTF-8");
            StringWriter stringBuffer = new StringWriter();
            PrintWriter pOut = new PrintWriter(stringBuffer);
            pOut.print("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        pOut.print("<!DOCTYPE MESSAGE SYSTEM \"http://127.0.0.1/psms/dtd/messagev12.dtd\" >");
        pOut.print("<MESSAGE VER=\"1.2\"><USER USERNAME=\""+userName+"\" PASSWORD=\""+password+"\"/>");
        pOut.print("<SMS UDH=\"0\" CODING=\"1\" TEXT=\""+ff+"\" PROPERTY=\"0\" ID=\"2\">");
        pOut.print("<ADDRESS FROM=\""+fromNo+"\" TO=\""+toNO+"\" SEQ=\"1\" TAG=\"\" />");
        pOut.print("</SMS>");
        pOut.print("</MESSAGE>");

        pOut.flush();
        pOut.close();


URL url = new URL("url");

        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setDoOutput(true);

        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));

        out.write("data="+message+"&action=send");
        out.flush();

СМС на английском рабочий файл в моем приложении.

Ответы [ 3 ]

2 голосов
/ 15 ноября 2010

Во-первых, new String(smsContent.getBytes("UTF-8"), "UTF-8") - это резервная передача туда и обратно, эквивалентная smsContent. Сначала вы кодируете строку как байты через UTF-8, а затем сразу же снова декодируете ее из байтов.

Во-вторых, ваш метод разгадывания XML полностью нарушен. Вы не можете просто объединять строки и надеяться получить в результате правильно сформированный XML. Просто, например, подумайте о том, что произойдет, если кто-то попытается отправить "? Используйте библиотеку XML.

В-третьих, вы неявно используете кодировку по умолчанию для платформы OutputStreamWriter вместо ее явного указания, что означает, что ваш код работает только на тех машинах, которые случайно имеют правильную кодировку по умолчанию. Я предполагаю, что ваш нет.

В-четвертых, ваш метод определения загадочных параметров POST не работает. Вы не указали, что такое переменная message. Я предполагаю, что это полный XML-документ, но затем вы пытаетесь отправить его в качестве параметра POST в какую-то службу HTTP, и в этом случае его необходимо экранировать / закодировать в URL. Например, что произойдет, если кто-то попытается отправить сообщение &data=<whatever>&? Пожалуйста, уточните.

См. Также Использование java.net.URLConnection для запуска и обработки HTTP-запросов

В-пятых, поскольку вы отправляете в какой-либо HTTP-сервис, вероятно, есть некоторая документация для этого сервиса, какую кодировку отправлять или как ее указать, возможно, с заголовком HTTP (возможно, «Content-type: application/x-www-form-urlencoded; charset=UTF-8»?). Укажите нам документацию, если вы сами не можете ее выяснить.

Редактировать: Нашел документацию: http://www.google.se/search?q=valuefirst+pace

В нем довольно четко сказано, что вам необходимо url-кодирование XML-документа, так что это, вероятно, то, чего вам не хватает, и в этом случае кодировка OutputStreamWriter не будет иметь значения, если она совместима с ASCII.

Однако в документации не указано, какую кодировку символов использовать для url-кодирования, что довольно слабо. UTF-8 является наиболее вероятным, хотя.

1 голос
/ 15 ноября 2010

Вы используете кодировку по умолчанию вашей платформы для данных запроса, которая может очень отличаться от UTF-8. Попробуйте указать UTF-8 в OutputStreamWriter:

... new OutputStreamWriter(connection.getOutputStream(), "UTF-8") ...

Другая проблема, конечно, в том, что ваш XML-документ, созданный вручную, потерпит неудачу, как только любой из ваших параметров будет содержать символы, которые должны быть экранированы в XML, но это другая история. Почему бы вам не использовать вместо этого библиотеку XML?


Просто дополнительная информация: в документации, на которую указывает Кристоффер, также объясняется, что используемый вами пример запроса подходит только для текстовых сообщений с символами в стандартном наборе символов SMS. Для поддержки символов Unicode вы должны использовать другой запрос.

1 голос
/ 15 ноября 2010

Из того, что я читал на некоторых интернет-страницах, SMS на арабском языке (и на других тоже) кодируются UCS-2 , а не UTF-8.Изменение кодировки стоит попробовать.

...