5

Muszę pobrać jakiś obiekt JSON ze zdalnego serwera i dla tego używam tej funkcji, która działa świetnie, z wyjątkiem tego, że czasami jakieś dziwne dane są pobierane, co uważam za jest to, że używa zestawu znaków ASCII do dekodowania.Jak zmienić kodowanie zestawu znaków w odpowiedzi HTTP w Javie

Poniżej znajduje sposobu THW że używam

public HttpResponse call(String serviceURL,String serviceHost,String namespace,String methodName,String payloadKey, String payloadValue) throws ClientProtocolException,IOException,JSONException 
    { 
      HttpResponse response = null; 
      HttpContext HTTP_CONTEXT = new BasicHttpContext(); 
      HTTP_CONTEXT.setAttribute(CoreProtocolPNames.USER_AGENT, "Mozilla/5.0"); 
      HttpPost httppost = new HttpPost(serviceURL); 
      httppost.setHeader("User-Agent",Constants.USER_AGENT_BROWSER_FIREFOX); 
      httppost.setHeader("Accept", "application/json, text/javascript, */*"); 
      httppost.setHeader("Accept-Language","en-US,en;q=0.8"); 
      httppost.setHeader("Content-Encoding", "foo-1.0"); 
      httppost.setHeader("Content-Type", "application/json; charset=UTF-8"); 
      httppost.setHeader("X-Requested-With","XMLHttpRequest"); 
      httppost.setHeader("Host",serviceHost); 
      httppost.setHeader("X-Foo-Target", String.format("%s.%s", namespace,methodName)); 
      /*Making Payload*/ 
      JSONObject objectForPayload = new JSONObject(); 
      objectForPayload.put(payloadKey, payloadValue); 
      StringEntity stringentity = new StringEntity(objectForPayload.toString()); 
      httppost.setEntity(stringentity); 
      response = client.execute(httppost); 
      return response; 


    } 

Wszystkie te nagłówki, że jestem przechodzącej są poprawne i mam zweryfikowane samo przez inspekcję element w Google Chrome lub wtyczki Firebug jeśli są zaznajomieni z Mozillą .

Problem polega na tym, że w większości przypadków otrzymuję czytelne dane, ale czasami dostaję nieczytelne dane.

I debugowania za pomocą eclipse i zauważyłem, że zestaw znaków pod wrappedEntity jest wyświetlany jako "US-ASCII". Załączam jpg dla odniesienia enter image description here

Czy ktoś może mi powiedzieć, jak mogę zmienić zestaw znaków z ASCII na UTF-8 odpowiedzi zanim zrobię response = client.execute(httppost);. PS: Jak już zauważyłeś, przechodzę charset = utf-8 w nagłówku i że już sprawdziłem, używając firebug i Google Chrome, że przekazuję dokładne nagłówki.

Powiększ, aby zobaczyć obraz jaśniej

góry dziękuję

Odpowiedz

1

może trzeba dodać nagłówka Accept-Encoding i ustawić to na UTF-8

+1

próbowałem tego, ale nie działało to samo wynik 'httppost.setHeader (" Accept-Encoding "," UTF-8 ");' – bourne

1

nie sądzę to problem z nagłówkami, myślę, że to problem z twoim ciągiem znaków. Posiadanie nagłówka mówi, że to utf-8 nie oznacza, że ​​napis jaki piszesz jest utf-8, a to zależy w dużej mierze od tego, jak kod został zakodowany i co jest w "payloadValue".

To powiedziawszy, zawsze możesz ponownie zakodować rzecz poprawnie przed wysłaniem jej przez przewód, na przykład:

objectForPayload.put(payloadKey, payloadValue); 
StringEntity stringentity = new StringEntity(
    new String(
     objectForPayload.toString().getBytes(), 
     "UTF8")); 

Sprawdź, czy to działa.

+0

dzięki za odpowiedź, ale to nie działało, ale co jestem zdezorientowany, ponieważ rygorystyczność jest tylko obiekt json, który przekazuję w polu danych i czy koduję go w utf-8, czy nie, nie powinien mieć znaczenia. ow zmienić kodowanie znaków odpowiedzi Myślę, że nie jestem w stanie zrobić – bourne

10

Udało mi się rozwiązać problem, wspominając o tym tylko osobom, które mogą mieć podobny problem. po otrzymaniu odpowiedzi najpierw uzyskać podmiot za pomocą HttpEntity entity = response.getEntity(); a od mojej odpowiedzi został podmiot obiekt JSON Konwersja na ciąg ale używając „UTF-8” coś takiego responseJsonObject = new JSONObject(EntityUtils.toString(entity,"UTF-8"));

wcześniej i był po prostu robi responseJsonObject = new JSONObject(EntityUtils.toString(entity));

+0

możesz zaakceptować własne odpowiedzi też – CyprUS

+1

Miałem ten sam problem, jak również, gdzie 'IOUtils.toString (entity.getContent()," UTF-8 ") 'nie działało. Zmiana na "EntityUtils" wykonała zadanie – divillysausages

Powiązane problemy