我对如何正常使用编码感到困惑。实际上,我读了一些书,它说我们应该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中运行我的客户端项目和服务器项目。