ServletOutputStream
前者设置的是发送的数据的编码方式。后者设置的是浏览器解析的编码方式和发送的数据的编码方式。
两种设置方式会相互覆盖:(但是 servletResponse.setContentType(“text/html;charset=GBK”)设置的浏览器解码方式不会消失)
当设置CharacterEncoding时
或者
均不会出现乱码。由此可以推出,当只设置CharacterEncoding时,浏览器的解码方式会自动识别。CharacterEncoding只是告诉浏览器我要发送的数据的编码类型。
那么,我即使告诉浏览器我发的数据的编码时ISO-8859-1(默认就是ISO-8859-1)也是可以成功解码。
也就是说这个CharacterEncoding实际上对ServletOutputStream不起作用。
当设置了ContentType时服务器数据的编码方式(对ServletOutputStream不起作用)和浏览器的解码都确定了。
因此
会产生乱码
而
不会产生乱码
PrintWriter
上面两种方式设置的服务器端传输的数据编码可以相互覆盖。
PrintWriter传输的数据会自动按照
编码方式进行编码。当不指定ContentType时,浏览器解码方式会按照与服务器端编码相匹配的方式进行解码。当指定ContentType时,按他指定的方式进行解码。
由此可以推断出,此时不能设置CharacterEnco为ISO-8859-1(因为发送前会把数据按照ISO-8859-1的方式进行编码,而中文不能用ISO-8859-1来表示)