2023年8月3日发(作者:)

HTTPBODY编码问题(中⽂字符乱码)在Servlet返回数据的时候,通过vletOutputStream获取ServletOutputStream返回到前端页⾯时没有出现乱码 // 打印到浏览器未出现乱码 ServletOutputStream pw = putStream(); (new String("UG中午").getBytes()); (); ();1-1原因是new String("UG中午").getBytes()使⽤的是系统默认的编码,此时是GBK,es()的源码如下所⽰: static byte[] encode(char[] ca, int off, int len) { // tCharset()默认读取还是配置的语⾔编码;也是就是系统的; String csn = tCharset().name(); try { // use charset name encode() variant which provides caching. return encode(csn, ca, off, len); } catch (UnsupportedEncodingException x) { warnUnsupportedCharset(csn); } try { return encode("ISO-8859-1", ca, off, len); } catch (UnsupportedEncodingException x) { // If this code is hit during VM initialization, MessageUtils is // the only way we will be able to get any kind of error message. ("ISO-8859-1 charset not available: " + ng()); // If we can not find ISO-8859-1 (a required encoding) then things // are seriously wrong with the installation. (1); return null; } }到了浏览器使⽤的解码也是GBK所以是正常的。不过在开发中这⾥还是建议设置成UTF-8.----------------------------------------但是使⽤PrintWriter打印时候,出现了乱码,解决办法是加上tentType("application/json; charset=utf-8");并且将racterEncoding(“UTF-8”)写在ter()前⾯ // 告诉浏览器⽤UTF-8解码 不加会出现乱码 tentType("application/json; charset=utf-8");

// 这句写上了可能会也没有效果: // 原因: racterEncoding("UTF-8")语句执⾏之前执⾏了ter()语句。 // 所以这句应该写在ter()前⾯ racterEncoding("UTF-8"); PrintWriter pw1 =ter(); ("C中午"); (); ();分析PrintWriter出现乱码的原因:当通过Reponse返回给客户的时候,这个过程需要先进⾏编码,再到浏览器进⾏解码。编码字符集可以通过racterEncoding来设置,它将会覆盖racterEncoding的值,并通过Header的ContentType返回到客户端,浏览器接收到的返回的Socket流时将通过Content-Type的charset来解码。默认的优先级从⾼到底如下:racterEncoding("UTF-8")设置编码格式2.通过HTTP Header中Content-Type的charset设置,如果没有进⾏第⼆步;3.通过HTMLde 中的charset来解码4.如果上⾯的都未定义,那么浏览器通过默认的编码器解码1-2 contentType中的charset

2023年8月3日发(作者:)

HTTPBODY编码问题(中⽂字符乱码)在Servlet返回数据的时候,通过vletOutputStream获取ServletOutputStream返回到前端页⾯时没有出现乱码 // 打印到浏览器未出现乱码 ServletOutputStream pw = putStream(); (new String("UG中午").getBytes()); (); ();1-1原因是new String("UG中午").getBytes()使⽤的是系统默认的编码,此时是GBK,es()的源码如下所⽰: static byte[] encode(char[] ca, int off, int len) { // tCharset()默认读取还是配置的语⾔编码;也是就是系统的; String csn = tCharset().name(); try { // use charset name encode() variant which provides caching. return encode(csn, ca, off, len); } catch (UnsupportedEncodingException x) { warnUnsupportedCharset(csn); } try { return encode("ISO-8859-1", ca, off, len); } catch (UnsupportedEncodingException x) { // If this code is hit during VM initialization, MessageUtils is // the only way we will be able to get any kind of error message. ("ISO-8859-1 charset not available: " + ng()); // If we can not find ISO-8859-1 (a required encoding) then things // are seriously wrong with the installation. (1); return null; } }到了浏览器使⽤的解码也是GBK所以是正常的。不过在开发中这⾥还是建议设置成UTF-8.----------------------------------------但是使⽤PrintWriter打印时候,出现了乱码,解决办法是加上tentType("application/json; charset=utf-8");并且将racterEncoding(“UTF-8”)写在ter()前⾯ // 告诉浏览器⽤UTF-8解码 不加会出现乱码 tentType("application/json; charset=utf-8");

// 这句写上了可能会也没有效果: // 原因: racterEncoding("UTF-8")语句执⾏之前执⾏了ter()语句。 // 所以这句应该写在ter()前⾯ racterEncoding("UTF-8"); PrintWriter pw1 =ter(); ("C中午"); (); ();分析PrintWriter出现乱码的原因:当通过Reponse返回给客户的时候,这个过程需要先进⾏编码,再到浏览器进⾏解码。编码字符集可以通过racterEncoding来设置,它将会覆盖racterEncoding的值,并通过Header的ContentType返回到客户端,浏览器接收到的返回的Socket流时将通过Content-Type的charset来解码。默认的优先级从⾼到底如下:racterEncoding("UTF-8")设置编码格式2.通过HTTP Header中Content-Type的charset设置,如果没有进⾏第⼆步;3.通过HTMLde 中的charset来解码4.如果上⾯的都未定义,那么浏览器通过默认的编码器解码1-2 contentType中的charset