java如何解码获取url参数收到抛出BeanParam

我收到了对此Web服务的GET响应

@GET @Path("/nnnnnn") public Response pfpfpfpf(@BeanParam NNNNNN n) 

NNNNNclass有:

 @QueryParam("parameter") private String parameter; 

对于该parameter有一个get和set。

我在一个带有查询参数的get上发送请求,它正在自动绑定到我的选项NNNNN,一切都很棒。

但是,现在我在查询url中发送日语字符串。 我在发送之前用UTF-8对参数进行编码,我必须使用UTF-8解码它们。

但我的问题是我应该在哪里调用URLDecoder? 我试图在该参数的getter中调用它,但它不起作用,我一直有类似C3%98%C2%B4%C3%98%C2而不是日文字符

适合我的解决方案是:

在servlet上,我应该这样做:

 request.setCharacterEncoding("UTF-8"); 

然后在html页面上我必须添加这个:

  

这是一个很好的问题,对于如何在系统之间处理(编码和解码)信息有很多疑问。

在我继续之前,我必须说对Charset,编码等有一个公平的理解。你可能想要阅读这个答案,以便快速了解。

这必须从2个角度看 – 浏览器和服务器。

浏览器的编码视角

每个浏览器都将呈现信息/文本,现在呈现它必须知道如何解释这些位/字节的信息/文本,以便它可以正确呈现( 阅读我的答案的第3个子弹 ,相同的位可以表示不同编码中的不同字符计划 )。

浏览器页面编码

  • 每个浏览器都有一个与之关联的默认编码。 检查一下如何查看浏览器的默认编码 。
  • 如果您未在HTML页面上指定任何编码,则浏览器的默认编码将生效,并将根据这些编码规则呈现页面。 因此,如果默认编码是ASCII并且您使用日语或中文或Unicode辅助平面中的字符,那么您将看到垃圾值。
  • 您可以使用告诉浏览器不使用您的默认编码方案,但使用此网站通过网站进行渲染。
    • 这正是你所做的/发现的,你很好,因为这个meta标记基本上覆盖了浏览器的默认编码。
    • 实现相同效果的另一种方法是不使用此元标记,只是更改浏览器的默认编码,但仍然可以。 但不建议这样做,建议在JSP中使用Content-Type元标记。

尝试使用以下简单的HTML来使用浏览器默认编码和meta标记。

      の, は, でした 
昨夜, 最高

服务器透视编码

服务器还应该知道如何解释传入的数据流,这基本上意味着使用哪种编码方案( 服务器部分很棘手,因为有几种可能性 )。 从这里阅读以下内容

当提交已输入HTML表单的数据时,表单字段名称和值将被编码并使用方法GET或POST在HTTP请求消息中发送到服务器,或者历史上通过电子邮件发送到服务器。 默认情况下使用的编码基于一般URI百分比编码规则的早期版本,具有许多修改,例如换行标准化和用“+”而不是“%20”替换空格。 以这种方式编码的MIME类型是application / x-www-form-urlencoded,它目前在HTML和XForms规范中定义(仍然是一种非常过时的方式)。 此外,CGI规范包含有关Web服务器如何解码此类数据并使其可供应用程序使用的规则。

这又有两个部分,即服务器应如何解码传入的请求流以及它应如何编码传出的响应流。

根据用例,有几种方法可以执行此操作,例如:

  • HTTP请求和响应对象中有setCharacterEncodingsetContentType等方法,可用于设置编码。
    • 正是您在服务器中使用UTF-8编码方案解码请求数据的情况所做的,因为我期待高级Unicode辅助平面字符。 但这不是全部,请在下面阅读更多内容。
  • 使用-Dfile.encoding=utf8等JVM属性在服务器或JVM级别设置编码。 阅读本文 ,了解如何设置服务器编码。

在您的情况下,您从URL的查询字符串中获取日语字符,查询字符串是HTTP请求对象的一部分,因此使用request.setCharacterEncoding("UTF-8"); 您可以获得所需的编码结果。

但同样不适用于URL编码,这与请求编码 (您的情况)不同。 考虑下面的示例,在两个sysout ,即使使用request.setCharacterEncoding("UTF-8");您也无法看到所需的编码效果request.setCharacterEncoding("UTF-8"); 因为在这里你需要URL编码,因为URL将类似于http://localhost:7001/springapp/forms/executorTest/encodingTest/hellothere 昨夜, 最高并且在此URL中没有查询字符串。

 @RequestMapping(value="/encodingTest/{quertStringValue}", method=RequestMethod.GET) public ModelAndView encodingTest(@PathVariable("quertStringValue") String quertStringValue, ModelMap model, HttpServletRequest request) throws UnsupportedEncodingException { System.out.println("############### quertStringValue " + quertStringValue); request.setCharacterEncoding("UTF-8"); System.out.println("############### quertStringValue " + quertStringValue); return new ModelAndView("ThreadInfo", "ThreadInfo", "@@@@@@@ This is my encoded output " + quertStringValue); } 

根据您使用的框架,您可能需要其他配置来为请求或URL指定字符编码,以便在请求尚未指定编码时应用自己的编码,或在任何情况下强制执行编码。 这很有用,因为即使在HTML页面或表单中指定,当前浏览器通常也不会设置字符编码。

在Spring中,有org.springframework.web.filter.CharacterEncodingFilter用于配置请求编码。 阅读这个基于这个事实的类似有趣的问题 。

坚果壳

每个计算机程序,无论是应用程序服务器,Web服务器,浏览器,IDE等,只能理解位,因此需要知道如何解释这些位以使其具有预期的意义,因为根据所使用的编码,相同的位可以表示不同的字符。 而这就是“编码”通过给出一个唯一的标识符来表示一个角色,以便所有计算机程序,各种操作系统等知道解释它的正确方法。