BlockingSenderDestination.sendReceive () UTF-8 проблема - PullRequest
0 голосов
/ 15 февраля 2011

В моем приложении Blackberry я загружаю JSON, используя следующий метод.

 private static Object loadJson(String uriStr){
    Object _json = null;
    Message response = null;
    BlockingSenderDestination bsd = null;

    try
    {
        bsd = (BlockingSenderDestination)
                    DestinationFactory.getSenderDestination
                        ("CommAPISample", URI.create(uriStr));

        if(bsd == null)
        {
            bsd =
              DestinationFactory.createBlockingSenderDestination
                  (new Context("CommAPISample"),
                   URI.create(uriStr), new JSONMessageProcessor()
                   );
        }
        response = bsd.sendReceive();
        _json = response.getObjectPayload();       
    }
    catch(Exception e)
    {
        System.out.println(e.toString());
    }
    finally
    {
        if(bsd != null)
        {
            bsd.release();
        }
    }
    return _json;
}

Это работает нормально. Но проблема в том, что когда я получаю JSON, арабские символы отображаются как нежелательные

(ا٠„Ø ± ئيس ال ت٠† Ù). Я отправил этот вопрос в форму поддержки Blackberry

Арабские шоу повреждены в выводе JSON

Согласно обсуждению, я кодирую арабский символ в формат \ uxxxx (в моем приложении на стороне сервера), и он работал. Но теперь я должен использовать JSON от кого-то другого, где я не могу изменить код на стороне сервера.

Они используют asp.net C #, так как они отправляют данные следующим образом.

 JsonResult result = new JsonResult();
 result.ContentEncoding = System.Text.Encoding.UTF8;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 result.Data = “Data Object (Contains Arabic) comes here”
 return result;

Так что мой вопрос: если сервер предоставляет данные вышеуказанным способом, метод BlockingSenderDestination.sendReceive может получить данные utf-8? Или он ожидает только \ uxxxx закодированных данных для non-ascii. Или я должен сделать что-то еще (например, отправить заголовок на сервер), чтобы я мог напрямую использовать данные utf-8.

В режиме отладки я проверяю значение «response». Это уже показывает ненужные символы.

Кроме JSON, я могу работать с арабским языком везде.

Вчера я опубликовал этот выпуск в форме Blackberry . Но до сих пор нет ответа.

Я новичок в ежевике и Java. Прошу прощения, если это глупый вопрос.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Какой тип содержимого в ответе? Сервер явно определяет кодировку UTF-8 в заголовке HTTP? e.g.:

Тип содержимого: текст / JSON; кодировка = UTF-8

Если API игнорирует кодировку в типе содержимого HTTP, более простой способ выполнить преобразование String - определить, является ли полученное сообщение ByteMessage или StreamMessage. Получить сообщение в виде байтового массива, а затем преобразовать в строку, используя кодировку UTF-8

т.е:.

Message msg = bsd.sendReceive();
byte[] msgBytes = null;

if (msg instanceof ByteMessage) {
    msgBytes = ((ByteMessage) msg).getBytePayload();
}
else { /* StreamMessage */
   // TODO read the bytes from the stream into a byte array
}
return new String(msgBytes,"UTF-8");
0 голосов
/ 15 февраля 2011

Наконец я нашел решение сам.

Данные, отправленные с сервера, были в формате UTF-8, который использует двухбайтовый код для отображения одного символа.Но BlockingSenderDestination.sendReceive () не может идентифицировать это.Так что создается один символ для каждого байта.Таким образом, решение состояло в том, чтобы получить каждый символ и получить байт от этого символа и добавить в массив байтов.Из этого байтового массива создайте строку с кодировкой UTF8.

Если кто-нибудь знает, как использовать BlockingSenderDestination.sendReceive () для utf-8, пожалуйста, напишите здесь.Так что мы можем избежать этого дополнительного метода преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...