2015-10-20 75 views
1

我有一个REST Web服务,它以JSON(作为多部分表单数据)的形式输入。输入字符串编码,需要原始字符串 - Java代码

@POST 
@Consumes ({"application/ds-json",MediaType.APPLICATION_FORM_URLENCODED,MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML,"text/html",MediaType.MULTIPART_FORM_DATA}) 
@Produces({ text_html, "application/ds-json" }) 
@Path("/abc") 
public Response abc(@Context HttpServletRequest req, @Context HttpServletResponse response){ 
      . 
      . 
      . 
      . 
    String strInput = inputJSON.getString("data"); 
      . 
      . 
      . 
} 

输入JSON,我送是{"data":"Sécurité"},而串strInput我得到的价值是Sécurité

我试图java.net.URLDecoder.decode(strInput, "iso-8859-1")将其解码回其原有的特色,但未能成功。

我也试过String strInput = new String((inputJSON.getString("data")).getBytes(), "iso-8859-1");预期传入的字符将按照需求存储在变量strInput中,但失败。

我觉得完全迷失在这里。有人可以帮忙吗?


编辑:

更清晰,下面是究竟如何我送了JSON这一服务(仅用于测试目的):

  1. 我已经创建了一个HTML页面可以发送POST请求的Web服务

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
 
    <title>Insert title here</title> 
 
</head> 
 

 
<body> 
 

 
    <form action="http://localhost:8080/xxxx/abc" method="POST" enctype="multipart/form-data"> 
 

 
    JSON: 
 
    <input type="text" name="data"> 
 
    <input type="submit" name="submit"> 
 
    </form> 
 
</body> 
 

 
</html>

  • 在页面,我输入文本作为使用UTF-16Sécurité
  • +0

    尝试UTF-8或UTF-16,可能? –

    +1

    你在哪里看到错误的编码字符串?在你的IDE,数据库或其他地方? – Patrick

    +0

    在我的IDE,后来我送这个字符串用作电子邮件主题行的电子邮件通知。还有它显示为相同的'Sécurité' –

    回答

    0

    谢谢大家,我总算解决这个问题,@ kayaman的评论帮助我到达这里

    你看到的是UTF-8的数据解码为ISO-8859-1。 - Kayaman

    我刚转换的输入字符串strInput到字节每ISO-8859-1编码和再次创建新的字符串按照UTF-8编码。这为我做了这份工作。

    byte[] inputBytes = strInput.getBytes("iso-8859-1"); 
    strInput = new String(inputBytes, "UTF-8"); 
    

    早些时候,我获取输入字符串的字节byte[] inputBytes = strInput.getBytes();它默认是返回我这是比我预期的额外字节UTF-8解码的位元(我提到,@Kayaman):

    @Kayaman是的,你是非常正确的,我在一个单独的测试课上进行测试。但在我目前的情况下(网络服务),我作为输入获得的数据似乎以某种方式被破坏。我试图打印输入和期望的字符串的字节:字节[] S = strInput.getBytes(“UTF-8”); byte [] s1 =“安全”.getBytes(“UTF-8”);其结果是:s = [83,-61,-125,-62,-87,99,117,114,105,116,-61,-125,-62,-87] s1 = [83,-61, -87,99,117,114,105,116,-61,87]这两个应该是相同的,但是我得到额外的字节{-125,-62} - Ankan Priya

    但是,作为字符串是ISO-8859-1编码形式,我需要使用相同的解码方案来获取字节和它的工作(见上文的代码片段)

    1

    所有的Java字符存储在存储器中。问题来自传输的字节。你写

    我送是{"data":"Sécurité"}

    它只是一种表象,它没有提供有关用于文本传输字节表示的信息。如果使用的表示不是响应的一部分,则接收器不能创建它。如果缺少编码,发件人和消费者都必须依赖相同的约定。例如,某些协议有默认值,但这意味着发送者和接收者都遵守标准默认值,并且它们也必须与规范同步(默认编码随时间变化)。

    从您的具体问题,当您的Java请求处理器已收到发送的字节,它已使用Charset将其转换为Java char。不支持的字节在此转换中丢失。

    的可能的解决方案:

    1. 使发件人ALWAYS specifiy使用的编码
    2. 添加一个猜测基于一些请求元数据的默认编码的请求过滤器(即User-Agent
    3. 停止使用IE(如据我所知,IE8的确做错事与编码,特别是XHR)

    注:must-read文章:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

    0

    尝试在消耗参数添加:

    + “;字符集= UTF-8”

    POR例如:

    MediaType.APPLICATION_JSON +“;字符集= UTF -8“

    我使用它,但与输出和工作正常。

    +0

    我试过,但没有真正的帮助。整个问题仍然完全相同。 –