如果在内容类型中声明charset,是否需要setCharacterEncoding()?

时间:2014-11-12 04:36:19

标签: java servlets encoding utf-8 character-encoding

我对如何正常使用编码感到困惑。实际上,我读了一些书,它说我们应该setCharacterEncoding之前getParameter()。虽然根据https://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#setCharacterEncoding%28java.lang.String%29

  

覆盖此正文中使用的字符编码的名称   请求。必须在读取请求之前调用此方法   参数或使用getReader()读取输入。否则,它没有   效果。

所以,我认为因为容器必须知道字体在HTTP主体中是什么,所以如果在HTTP主体中声明了charset,我们似乎不需要setCharacterEncoding()

我尝试使用现有项目,该项目将使用xml输出流提交请求,我使用

conn.setRequestProperty("Content-type", "text/xml;charset=utf-8");
PrintWriter pw = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8")); 

对流进行编码,当我将此请求提交给Servlet时,even though I do not call request.setCharacterEncoding(" UTF-8");`我可以看到中文文本已被很好地解码

所以它似乎有效,但是当我从内容类型中删除charset=utf-8时,它也有效,这更令人困惑。

以下是我将xml流读入地图的方法。

public  static Map<String, String>  parseXml(HttpServletRequest request) throws IOException, DocumentException {
    Map<String,String> map=new HashMap<String,String>();
    InputStream is =request.getInputStream();
    SAXReader reader=new SAXReader();
    Document document=reader.read(is);      
    Element root =document.getRootElement();
    List<Element> elementList=root.elements();
    for(Element e: elementList){
        map.put(e.getName(), e.getText());
    }
    return map;     
}

任何人都可以解释一下Servlet处理POST请求时编码的工作方式。我们需要什么时候才能明确地设置setCharacterEncoding()?

PS:我在Eclipse中运行我的客户端项目和服务器项目。

0 个答案:

没有答案