Тайский символ превращается в знак вопроса - PullRequest
0 голосов
/ 17 января 2019

У меня есть сторонний API, который дает мне JSON-ответ

{
"name": "บรีส",
"company": "Таиланд",
}

В ответе выше Json у меня есть некоторые тайские символы, когда я непосредственно получаю доступ к API, я получаю правильные тайские символы, но когда я вызываю его из моего RestClient, я получаю этот символ как ????

{
"name":"????????????",
"company":"??????????????"
}

Вот мой код RestClient

private void executeRequest(HttpUriRequest request,    String url) throws CommonException, IOException{
    //logger.debug(CLASS_NAME+" executeRequest : Entry :: url ->"+url + " Request: "+ postData );
    RequestConfig requestConfig = RequestConfig.custom()
               .setConnectTimeout(connectionTimeOut)
               .setConnectionRequestTimeout(soTimeOut)
               .setSocketTimeout(soTimeOut)
               .build();

    CloseableHttpClient client;

        client = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig)
                .useSystemProperties().build();

    HttpContext localContext = new BasicHttpContext();
    CloseableHttpResponse httpResponse = null  ;
    InputStream instream = null;
    try {
        httpResponse = client.execute(request, localContext);
        responseCode = httpResponse.getStatusLine().getStatusCode();
        message = httpResponse.getStatusLine().getReasonPhrase();
        HttpEntity entity = httpResponse.getEntity();
        if (entity != null) {
            instream = entity.getContent(); 
            response = convertStreamToString(instream);
        }

    } catch (ClientProtocolException e) {
        //logger.debug(CLASS_NAME+" :: executeRequest : ClientProtocolException :: url ->"+url+ " responseCode -> " +  responseCode + "message -> " + message  + " Service Execution Rime: "+lSvcExecTime+"\n  Request -> "+postData + "  Exception : "+ e.getMessage() );
        throw e; 
    }catch (SocketException e) {
        //logger.debug(CLASS_NAME+" :: executeRequest : SocketException :: url ->"+url+ " responseCode -> " +  responseCode + "message -> " + message  + " Service Execution Rime: "+lSvcExecTime+"\n  Request -> "+postData + "  Exception : "+ e.getMessage() );
        throw e; 

    } finally {
        if(httpResponse!=null){
            httpResponse.close();
        }
        if(null != instream){
            instream.close();
        }
    }
}

private static String convertStreamToString(InputStream is) throws UnsupportedEncodingException {
    ByteArrayOutputStream result = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        try {
            while((length = is.read(buffer)) != -1){
                result.write(buffer,0,length);
            }
        } catch (IOException e) {
            //logger.error(CLASS_NAME+" IOException due to - "+e.getMessage());
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                //logger.error(CLASS_NAME+"IOException inside finally due to - "+e.getMessage());
            }
        }
        log.warning("Response in RestClient ---"+result.toString());
        //return result.toString();
        return new String(result.toString().getBytes(), "UTF-8");
}

Этот код отлично работает в моей локальной системе, но когда я запускаю этот код на сервере, он дает мне ????.

Примечание: при вызове RestClient я добавляю заголовок -

        client.AddHeader("Content-Type","application/json; charset=utf-8");

Пожалуйста, подскажите, что мне делать.

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

1 Ответ

0 голосов
/ 17 января 2019

Изменить это выражение

new String(result.toString().getBytes(), "UTF-8")

до

new String(result.toByteArray(), "UTF-8")

Сначала преобразуя result в строку, а затем обратно в байты, вы преобразуете данные, используя кодировку JVM по умолчанию, которая предположительно является UTF-8 на вашем локальном компьютере, но не на вашем сервере.


Пара наблюдений:

  • Вам следует внимательно посмотреть на настройку вашей JVM в рабочей среде: установите для кодировки по умолчанию значение, которое вы намереваетесь, например, UTF-8, так что вы не удивитесь, если не используете UTF-8.
  • Вам не нужно читать ByteArrayOutputStream, а затем преобразовывать в String впоследствии: обернуть InputStream в InputStreamReader (с указанием кодировки) и BufferedReader: тогда вы можете читайте символы напрямую и добавляйте их, скажем, к StringBuilder.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...