BlockingSenderDestination.sendReceive() UTF-8 issue

匿名 (未验证) 提交于 2019-12-03 01:46:01

问题:

In my Blackberry application I am loading JSON using the following method.

 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; }

This is working fine. But the problem is when I am getting JSON, Arabic characters show as junk

Arabic shows corrupted in the JSON output

As per the discussion, I encode the Arabic character into \uxxxx format(In my server side application) and it was working. But now I have to use a JSON from somebody else where I can’t change the server side code.

They are using asp.net C# , as per them they are sending the data like the following.

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

So my question is, If the server provide the data in the above manner, BlockingSenderDestination.sendReceive method can get a utf-8 data? Or it is expecting only \uxxxx encoded data for non-ascii. Or I have to do something else (like sending some header to server) so that I can directly use the utf-8 data.

In debug mode I check the value of 'response'. It is already showing junk characters.

Except from JSON I am able to handle Arabic everywhere else.

Yesterday I posted this issue in Blackberry form . But till now no reply.

I am new to blackberry and Java. So I am sorry if this is silly question.

Thanks in advance.

回答1:

What is the content type in the response? Is the server explicitly defining the UTF-8 character encoding in the HTTP header? e.g.:

Content-Type: text/json; charset=UTF-8

If the API is ignoring the charset in the HTTP content type, an easier way to do the String conversion is by determining whether the Message received is a ByteMessage or a StreamMessage. Retrieve the message as a byte array and then convert to a string using the UTF-8 encoding

i.e.:

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");


回答2:

At last I found the solution myself.

The data sending from server was in UTF-8 which uses double byte to show single character. But BlockingSenderDestination.sendReceive() is not able to identify that. So it is creating one character for each byte. So the solution was to get each character and get the byte from that character and add to a byte array. From that byte array create a string with UTF8 encoding.

If anyone know to use BlockingSenderDestination.sendReceive() for utf-8 please post here. So that we can avoid this extra conversion method.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!