2017-10-17 73 views
0

我有一个实用程序用于集成数据,并且在使用特殊字符(如“Ô)时遇到问题。下面是问题出现的问题的方法。响应来自API并且采用xml格式。HTTPGet unicode字符出现在响应中字符串

protected String getStringHttpContent(URI url, Map<String,String> headerParameters) throws IOException 
    { 
     HttpGet request = new HttpGet(url); 
    for(String parameter : headerParameters.keySet()) 
      request.setHeader(parameter, headerParameters.get(parameter)); 

     CloseableHttpResponse response = getClient().execute(request); 
     dumpHeaders(response); 
     BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
     StringBuffer sb = new StringBuffer(); 
     String output; 
     while ((output = br.readLine()) != null) { 
      sb.append(output); 
     } 
    response.close(); 
     return sb.toString(); 

    } 

在响应字符串中的njÃientill的结果是njämientill。我试过改变编码,但结果保持不变。任何意见,将不胜感激。

+0

你是否检查过什么字符编码 - 如果有的话 - 远程方通过响应头指示? – CBroe

+0

是的,编码以gzip形式出现。我试图通过为gzip添加适当的头来解决这个问题,但结果保持不变。 – Filiper

回答

0

确保您使用UTF-8编码端到端(通过整个链)。这包括你的网页和用户输入,如果它来自html表单(例如),在页面上设置UTF-8,web服务(web.xml,sun-web.xml等)。入站HttpRequest也应包含标题属性“字符集”,例如。 “Content-Type:text/html; charset = utf-8”。配置服务器端和客户端的方式取决于您使用的技术(我不知道)。

编辑:关于你的评论,即使你是客户,你应该设置内容类型来定义你从服务器期待(这一个可能是能够在同一服务的不同内容类型的内容URL)。

请尝试用配置HTTPGET:

request.setHeader(HttpHeaders.CONTENT_TYPE, "application/xml; charset=utf-8"); 

或者(如果服务器是很老):

request.setHeader(HttpHeaders.CONTENT_TYPE, "text/xml; charset=utf-8"); 

更好,也许连同接受的charset指定接受头:

request.setHeader("Accept-Charset", "utf-8"); 
request.setHeader("Accept", "application/xml"); 

如果这些作品都不起作用,我建议你在这里展示你的邮递员查询或做一个Wireshark捕获看到的实际请求和响应,另外还列出了头部参数图的内容。否则,我们无法为您提供更多帮助(因为您的其他代码看起来不错,依我看来)。

+0

谢谢,我试了很多次,但结果保持不变。我无法访问提供响应的服务器,因为它在客户端,但使用简单的API获取工具(如邮递员),我没有这个问题。 – Filiper

+0

已编辑。希望它有帮助.. – bsaverino

+0

再次感谢,不幸的是,响应不会改变。关于地图,对于这个请求,它只是简单的“接受内容:application/xml”。以下是邮递员输出的邮件头减去cookies。 内容编码gzip的→内容 型→应用程序/ XML 日期→太阳,2017年10月22日16:30:00 GMT 服务器→的ServiceNow 严格,运输和安全→最大年龄= 63072000; includeSubDomains 传输编码→分块 X-Is-Logged-In→true – Filiper