解决方案网站深圳市最新出行政策
news/
2025/9/30 6:37:55/
文章来源:
解决方案网站,深圳市最新出行政策,鹿城做网站,西安seo代理商java编码转换过程我们总是用一个java类文件和用户进行最直接的交互(输入、输出)#xff0c;这些交互内容包含的文字可能会包含中文。无论这些java类是与数据库交互#xff0c;还是与前端页面交互#xff0c;他们的生命周期总是这样的#xff1a;1、程序员在操作系统上通过编…java编码转换过程我们总是用一个java类文件和用户进行最直接的交互(输入、输出)这些交互内容包含的文字可能会包含中文。无论这些java类是与数据库交互还是与前端页面交互他们的生命周期总是这样的1、程序员在操作系统上通过编辑器编写程序代码并且以.java的格式保存操作系统中这些文件我们称之为源文件。2、通过JDK中的javac.exe编译这些源文件形成.class类。3、直接运行这些类或者部署在WEB容器中运行得到输出结果。这些过程是从宏观上面来观察的了解这个肯定是不行的我们需要真正来了解java是如何来编码和被解码的第一步当我们用编辑器编写java源文件程序文件在保存时会采用操作系统默认的编码格式(一般我们中文的操作系统采用的是GBK编码格式)形成一个.java文件。java源文件是采用操作系统默认支持的file.encoding编码格式保存的。下面代码可以查看系统的file.encoding参数值。System.out.println(System.getProperty(file.encoding));第二步当我们使用javac.exe编译我们的java文件时JDK首先会确认它的编译参数encoding来确定源代码字符集如果我们不指定该编译参数JDK首先会获取操作系统默认的file.encoding参数然后JDK就会把我们编写的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。第三步JDK将上面编译好的且保存在内存中信息写入class文件中形成.class文件。此时.class文件是Unicode编码的也就是说我们常见的.class文件中的内容无论是中文字符还是英文字符他们都已经转换为Unicode编码格式了。在这一步中对对JSP源文件的处理方式有点儿不同WEB容器调用JSP编译器JSP编译器首先会查看JSP文件是否设置了文件编码格式如果没有设置则JSP编译器会调用调用JDK采用默认的编码方式将JSP文件转化为临时的servlet类然后再编译为.class文件并保持到临时文件夹中。第四步运行编译的类在这里会存在一下几种情况1、直接在console上运行。2、JSP/Servlet类。3、java类与数据库之间。这三种情况每种情况的方式都会不同1.Console上运行的类这种情况下JVM首先会把保存在操作系统中的class文件读入到内存中这个时候内存中class文件编码格式为Unicode然后JVM运行它。如果需要用户输入信息则会采用file.encoding编码格式对用户输入的信息进行编码同时转换为Unicode编码格式保存到内存中。程序运行后将产生的结果再转化为file.encoding格式返回给操作系统并输出到界面去。整个流程如下在上面整个流程中凡是涉及的编码转换都不能出现错误否则将会产生乱码。2.Servlet类由于JSP文件最终也会转换为servlet文件(只不过存储的位置不同而已)所以这里我们也将JSP文件纳入其中。当用户请求Servlet时WEB容器会调用它的JVM来运行Servlet。首先JVM会把servlet的class加载到内存中去内存中的servlet代码是Unicode编码格式的。然后JVM在内存中运行该Servlet在运行过程中如果需要接受从客户端传递过来的数据(如表单和URL传递的数据)则WEB容器会接受传入的数据在接收过程中如果程序设定了传入参数的的编码则采用设定的编码格式如果没有设置则采用默认的ISO-8859-1编码格式接收的数据后JVM会将这些数据进行编码格式转换为Unicode并且存入到内存中。运行Servlet后产生输出结果同时这些输出结果的编码格式仍然为Unicode。紧接着WEB容器会将产生的Unicode编码格式的字符串直接发送置客户端如果程序指定了输出时的编码格式则按照指定的编码格式输出到浏览器否则采用默认的ISO-8859-1编码格式。整个过程流程图如下3.数据库部分我们知道java程序与数据库的连接都是通过JDBC驱动程序来连接的而JDBC驱动程序默认的是ISO-8859-1编码格式的也就是说我们通过java程序向数据库传递数据时JDBC首先会将Unicode编码格式的数据转换为ISO-8859-1的编码格式然后在存储在数据库中即在数据库保存数据时默认格式为ISO-8859-1。编码解码在上篇博客中LZ阐述了三个渠道的编码转换过程下面LZ将结束java在那些场合需要进行编码和解码操作并详序中间的过程进一步掌握java的编码和解码过程。在java中主要有四个场景需要进行编码解码操作1I/O操作2内存3数据库4javaWeb下面主要介绍前面两种场景数据库部分只要设置正确编码格式就不会有什么问题javaWeb场景过多需要了解URL、get、POST的编码servlet的解码所以javaWeb场景下节LZ介绍。I/O操作在前面LZ就提过乱码问题无非就是转码过程中编码格式的不统一产生的比如编码时采用UTF-8解码采用GBK但最根本的原因是字符到字节或者字节到字符的转换出问题了而这中情况的转换最主要的场景就是I/O操作的时候。当然I/O操作主要包括网络I/O(也就是javaWeb)和磁盘I/O。网络I/O下节介绍。首先我们先看I/O的编码操作。InputStream为字节输入流的所有类的超类Reader为读取字符流的抽象类。java读取文件的方式分为按字节流读取和按字符流读取其中InputStream、Reader是这两种读取方式的超类。按字节我们一般都是使用InputStream.read()方法在数据流中读取字节(read()每次都只读取一个字节效率非常慢我们一般都是使用read(byte[]))然后保存在一个byte[]数组中最后转换为String。在我们读取文件时读取字节的编码取决于文件所使用的编码格式而在转换为String过程中也会涉及到编码的问题如果两者之间的编码格式不同可能会出现问题。例如存在一个问题test.txt编码格式为UTF-8那么通过字节流读取文件时所获得的数据流编码格式就是UTF-8而我们在转化成String过程中如果不指定编码格式则默认使用系统编码格式(GBK)来解码操作由于两者编码格式不一致那么在构造String过程肯定会产生乱码如下File file new File(C:\\test.txt);InputStream input newFileInputStream(file);StringBuffer buffer newStringBuffer();byte[] bytes new byte[1024];for(int n ; (n input.read(bytes))!-1; ){buffer.append(new String(bytes,0,n));}System.out.println(buffer);输出结果锘挎垜鏄?cmtest.txt中的内容为我是 cm。要想不出现乱码在构造String过程中指定编码格式使得编码解码时两者编码格式保持一致即可buffer.append(new String(bytes,0,n,UTF-8));按字符其实字符流可以看做是一种包装流它的底层还是采用字节流来读取字节然后它使用指定的编码方式将读取字节解码为字符。在java中Reader是读取字符流的超类。所以从底层上来看按字节读取文件和按字符读取没什么区别。在读取的时候字符读取每次是读取留个字节字节流每次读取一个字节。字节字符转换字节转换为字符一定少不了InputStreamReader。API解释如下InputStreamReader 是字节流通向字符流的桥梁它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定或者可以接受平台默认的字符集。 每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换可以提前从底层流读取更多的字节使其超过满足当前读取操作所需的字节。API解释非常清楚InputStreamReader在底层读取文件时仍然采用字节读取读取字节后它需要根据一个指定的编码格式来解析为字符如果没有指定编码格式则采用系统默认编码格式。String file C:\\test.txt;String charset UTF-8;//写字符换转成字节流FileOutputStream outputStream newFileOutputStream(file);OutputStreamWriter writer newOutputStreamWriter(outputStream, charset);try{writer.write(我是 cm);}finally{writer.close();}//读取字节转换成字符FileInputStream inputStream newFileInputStream(file);InputStreamReader reader newInputStreamReader(inputStream, charset);StringBuffer buffer newStringBuffer();char[] buf new char[64];int count 0;try{while ((count reader.read(buf)) ! -1) {buffer.append(buf,0, count);}}finally{reader.close();}System.out.println(buffer);内存首先我们看下面这段简单的代码String s 我是 cm;byte[] bytes s.getBytes();String s1 new String(bytes,GBK);String s2 new String(bytes);在这段代码中我们看到了三处编码转换过程(一次编码两次解码)。先看String.getTytes():public byte[] getBytes() {return StringCoding.encode(value, 0, value.length);}内部调用StringCoding.encode()方法操作static byte[] encode(char[] ca, int off, intlen) {String csnCharset.defaultCharset().name();try{//use charset name encode() variant which provides caching.returnencode(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.MessageUtils.err(ISO-8859-1 charset not available: x.toString());//If we can not find ISO-8859-1 (a required encoding) then things//are seriously wrong with the installation.System.exit(1);return null;}}encode(char[] paramArrayOfChar, int paramInt1, int paramInt2)方法首先调用系统的默认编码格式如果没有指定编码格式则默认使用ISO-8859-1编码格式进行编码操作进一步深入如下String csn (charsetName null) ? ISO-8859-1 : charsetName;同样的方法可以看到new String 的构造函数内部是调用StringCoding.decode()方法public String(byte bytes[], int offset, intlength, Charset charset) {if (charset null)throw new NullPointerException(charset);checkBounds(bytes, offset, length);this.value StringCoding.decode(charset, bytes, offset, length);}decode方法和encode对编码格式的处理是一样的。对于以上两种情况我们只需要设置统一的编码格式一般都不会产生乱码问题。编码编码格式首先先看看java编码类图[1]首先根据指定的chart设置ChartSet类然后根据ChartSet创建ChartSetEncoder对象最后再调用 CharsetEncoder.encode 对字符串进行编码不同的编码类型都会对应到一个类中实际的编码过程是在这些类中完成的。下面时序图展示详细的编码过程通过这编码的类图和时序图可以了解编码的详细过程。下面将通过一段简单的代码对ISO-8859-1、GBK、UTF-8编码public classTest02 {public static void main(String[] args) throwsUnsupportedEncodingException {String string 我是 cm;Test02.printChart(string.toCharArray());Test02.printChart(string.getBytes(ISO-8859-1));Test02.printChart(string.getBytes(GBK));Test02.printChart(string.getBytes(UTF-8));}/*** char转换为16进制*/public static void printChart(char[] chars){for(int i 0 ; i chars.length ; i){System.out.print(Integer.toHexString(chars[i]) );}System.out.println();}/*** byte转换为16进制*/public static void printChart(byte[] bytes){for(int i 0 ; i bytes.length ; i){String hex Integer.toHexString(bytes[i] 0xFF);if (hex.length() 1) {hex 0 hex;}System.out.print(hex.toUpperCase() );}System.out.println();}}-------------------------outPut:6211 662f 20 636d3F 3F20 636DCE D2 CA C720 636DE688 91 E6 98 AF 20 63 6D通过程序我们可以看到“我是 cm”的结果为char[]6211 662f 20 636dISO-8859-13F 3F 20 636DGBKCE D2 CA C720 636DUTF-8E6 88 91 E6 98 AF 20 63 6D图如下编码解码通过下图我们可以了解在javaWeb中有哪些地方有转码用户想服务器发送一个HTTP请求需要编码的地方有url、cookie、parameter经过编码后服务器接受HTTP请求解析HTTP请求然后对url、cookie、parameter进行解码。在服务器进行业务逻辑处理过程中可能需要读取数据库、本地文件或者网络中的其他文件等等这些过程都需要进行编码解码。当处理完成后服务器将数据进行编码后发送给客户端浏览器经过解码后显示给用户。在这个整个过程中涉及的编码解码的地方较多其中最容易出现乱码的位置就在于服务器与客户端进行交互的过程。上面整个过程可以概括成这样页面编码数据传递给服务器服务器对获得的数据进行解码操作经过一番业务逻辑处理后将最终结果编码处理后传递给客户端客户端解码展示给用户。所以下面我就请求对javaweb的编码解码进行阐述。请求客户端想服务器发送请求无非就通过四中情况1、URL方式直接访问。2、页面链接。3、表单get提交4、表单post提交URL方式对于URL如果该URL中全部都是英文的那倒是没有什么问题如果有中文就要涉及到编码了。如何编码根据什么规则来编码又如何来解码呢下面LZ将一一解答首先看URL的组成部分在这URL中浏览器将会对path和parameter进行编码操作。为了更好地解释编码过程使用如下URLhttp://127.0.0.1:8080/perbank/我是cm?name我是cm将以上地址输入到浏览器URL输入框中通过查看http 报文头信息我们可以看到浏览器是如何进行编码的。下面是IE、Firefox、Chrome三个浏览器的编码情况可以看到各大浏览器对“我是”的编码情况如下path部分Query StringFirefoxE6 88 91 E6 98 AFE6 88 91 E6 98 AFChromeE6 88 91 E6 98 AFE6 88 91 E6 98 AFIEE6 88 91 E6 98 AFCE D2 CA C7查阅上篇博客的编码可知对于path部分Firefox、chrome、IE都是采用UTF-8编码格式对于Query String部分Firefox、chrome采用UTF-8IE采用GBK。至于为什么会加上%这是因为URL的编码规范规定浏览器将ASCII字符非 ASCII 字符按照某种编码格式编码成 16 进制数字然后将每个 16 进制表示的字节前加上“%”。当然对于不同的浏览器相同浏览器不同版本不同的操作系统等环境都会导致编码结果不同上表某一种情况对于URL编码规则下任何结论都是过早的。由于各大浏览器、各个操作系统对URL的URI、QueryString编码都可能存在不同这样对服务器的解码势必会造成很大的困扰下面我们将已tomcat看tomcat是如何对URL进行解码操作的。解析请求的 URL 是在 org.apache.coyote.HTTP11.InternalInputBuffer 的 parseRequestLine 方法中这个方法把传过来的 URL 的 byte[] 设置到 org.apache.coyote.Request 的相应的属性中。这里的 URL 仍然是 byte 格式转成 char 是在 org.apache.catalina.connector.CoyoteAdapter 的 convertURI 方法中完成的protected voidconvertURI(MessageBytes uri, Request request)throwsException {ByteChunk bcuri.getByteChunk();int length bc.getLength();CharChunk ccuri.getCharChunk();cc.allocate(length,-1);String enc connector.getURIEncoding(); //获取URI解码集if (enc ! null) {B2CConverter convrequest.getURIConverter();try{if (conv null) {conv newB2CConverter(enc);request.setURIConverter(conv);}}catch(IOException e) {...}if (conv ! null) {try{conv.convert(bc, cc, cc.getBuffer().length-cc.getEnd());uri.setChars(cc.getBuffer(), cc.getStart(), cc.getLength());return;}catch(IOException e) {...}}}//Default encoding: fast conversionbyte[] bbuf bc.getBuffer();char[] cbuf cc.getBuffer();int start bc.getStart();for (int i 0; i length; i) {cbuf[i] (char) (bbuf[i start] 0xff);}uri.setChars(cbuf,0, length);}从上面的代码可知对URI的解码操作是首先获取Connector的解码集该配置在server.xml中如果没有定义则会采用默认编码ISO-8859-1来解析。对于Query String部分我们知道无论我们是通过get方式还是POST方式提交所有的参数都是保存在Parameters然后我们通过request.getParameter解码工作就是在第一次调用getParameter方法时进行的。在getParameter方法内部它调用org.apache.catalina.connector.Request 的 parseParameters 方法这个方法将会对传递的参数进行解码。下面代码只是parseParameters方法的一部分//获取编码String enc getCharacterEncoding();//获取ContentType 中定义的 Charsetboolean useBodyEncodingForURI connector.getUseBodyEncodingForURI();if (enc ! null) { //如果设置编码不为空则设置编码为encparameters.setEncoding(enc);if (useBodyEncodingForURI) { //如果设置了Chartset则设置queryString的解码为ChartSetparameters.setQueryStringEncoding(enc);}}else { //设置默认解码方式parameters.setEncoding(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);if(useBodyEncodingForURI) {parameters.setQueryStringEncoding(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);}}从上面代码可以看出对query String的解码格式要么采用设置的ChartSet要么采用默认的解码格式ISO-8859-1。注意这个设置的ChartSet是在 http Header中定义的ContentType同时如果我们需要改指定属性生效还需要进行如下配置上面部分详细介绍了URL方式请求的编码解码过程。其实对于我们而言我们更多的方式是通过表单的形式来提交。表单GET我们知道通过URL方式提交数据是很容易产生乱码问题的所以我们更加倾向于通过表单形式。当用户点击submit提交表单时浏览器会更加设定的编码来编码数据传递给服务器。通过GET方式提交的数据都是拼接在URL后面(可以当做query String)来提交的所以tomcat服务器在进行解码过程中URIEncoding就起到作用了。tomcat服务器会根据设置的URIEncoding来进行解码如果没有设置则会使用默认的ISO-8859-1来解码。假如我们在页面将编码设置为UTF-8而URIEncoding设置的不是或者没有设置那么服务器进行解码时就会产生乱码。这个时候我们一般可以通过new String(request.getParameter(name).getBytes(iso-8859-1),utf-8) 的形式来获取正确数据。表单POST对于POST方式它采用的编码也是由页面来决定的即contentType。当我通过点击页面的submit按钮来提交表单时浏览器首先会根据ontentType的charset编码格式来对POST表单的参数进行编码然后提交给服务器在服务器端同样也是用contentType中设置的字符集来进行解码(这里与get方式就不同了)这就是通过POST表单提交的参数一般而言都不会出现乱码问题。当然这个字符集编码我们是可以自己设定的request.setCharacterEncoding(charset) 。我们知道JSP页面是需要转换为servlet的在转换过程中肯定是要进行编码的。在JSP转换为servlet过程中下面一段代码起到至关重要的作用。在上面代码中有两个地方存在编码pageEncoding、contentType的charset。其中pageEncoding是jsp文件本身的编码而contentType的charset是指服务器发送给客户端时的内容编码。jsp在转换为Servlet的过程中是需要经过主要的三次编码转换过程(除去数据库编码转换、页面参数输入编码转换)第一次转换为.java文件第二次转换为.class文件第三次业务逻辑处理后输出。第一阶段JVM将JSP编译为.jsp文件。在这个过程中pageEncoding就起到作用了JVM首先会获取pageEncoding的值如果该值存在则采用它设定的编码来编译否则则采用file.encoding编码来编译。第二阶段JVM将.java文件转换为.class文件。在这个过程就与任何编码的设置都没有关系了不管JSP采用了什么样的编码格式都将无效。经过这个阶段后.jsp文件就转换成了统一的Unicode格式的.class文件了。第三阶段后台经过业务逻辑处理后将产生的结果输出到客户端。在这个过程中contentType的charset就发挥了功效。如果设置了charset则浏览器就会使用指定的编码格式进行解码否则采用默认的ISO-8859-1编码格式进行解码处理。流程如如下我们主要通过两种形式提交向服务器发送请求URL、表单。而表单形式一般都不会出现乱码问题乱码问题主要是在URL上面。通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了。不同的操作系统、不同的浏览器、不同的网页字符集将导致完全不同的编码结果。如果程序员要把每一种结果都考虑进去是不是太恐怖了有没有办法能够保证客户端只用一种编码方法向服务器发出请求有这里我主要提供以下几种方法一、javascript使用javascript编码不给浏览器插手的机会编码之后再向服务器发送请求然后在服务器中解码。在掌握该方法的时候我们需要料及javascript编码的三个方法escape()、encodeURI()、encodeURIComponent()。escape采用SIO Latin字符集对指定的字符串进行编码。所有非ASCII字符都会被编码为%xx格式的字符串其中xx表示该字符在字符集中所对应的16进制数字。例如格式对应的编码为%20。它对应的解码方法为unescape()。事实上escape()不能直接用于URL编码它的真正作用是返回一个字符的Unicode编码值。比如上面“我是cm”的结果为%u6211%u662Fcm其中“我”对应的编码为6211“是”的编码为662F“cm”编码为cm。注意escape()不对编码。但是我们知道网页在提交表单的时候如果有空格则会被转化为字符。服务器处理数据的时候会把号处理成空格。所以使用的时候要小心。encodeURI对整个URL进行编码它采用的是UTF-8格式输出编码后的字符串。不过encodeURI除了ASCII编码外对于一些特殊的字符也不会进行编码如! # $ * ( ) : / ; ? 。encodeURIComponent把URI字符串采用UTF-8编码格式转化成escape格式的字符串。相对于encodeURIencodeURIComponent会更加强大它会对那些在encodeURI()中不被编码的符号(; / ? : $ , #)统统会被编码。但是encodeURIComponent只会对URL的组成部分进行个别编码而不用于对整个URL进行编码。对应解码函数方法decodeURIComponent。当然我们一般都是使用encodeURI方来进行编码操作。所谓的javascript两次编码后台两次解码就是使用该方法。javascript解决该问题有一次转码、两次转码两种解决方法。一次转码javascript转码var url /ShowMoblieQRCode.servlet?name我是cm;window.location.href encodeURI(url);后台处理:String name request.getParameter(name);System.out.println(前台传入参数 name);name new String(name.getBytes(ISO-8859-1),UTF-8);System.out.println(经过解码后参数 name);输出结果前台传入参数??????cm经过解码后参数我是cm二次转码var url /ShowMoblieQRCode.servlet?name我是cm;window.location.href encodeURI(encodeURI(url));后台处理String name request.getParameter(name);System.out.println(前台传入参数 name);name URLDecoder.decode(name,UTF-8);System.out.println(经过解码后参数 name);输出结果前台传入参数E68891E698AFcm经过解码后参数我是cmfilter使用过滤器过滤器LZ提供两种第一种设置编码第二种直接在过滤器中进行解码操作。过滤器1该过滤器是直接设置request的编码格式的。public class CharacterEncoding implementsFilter {privateFilterConfig config ;String encoding null;public voiddestroy() {config null;}public voiddoFilter(ServletRequest request, ServletResponse response,FilterChain chain)throwsIOException, ServletException {request.setCharacterEncoding(encoding);chain.doFilter(request, response);}public void init(FilterConfig config) throwsServletException {this.config config;//获取配置参数String str config.getInitParameter(encoding);if(str!null){encodingstr;}}}配置chineseEncodingcom.test.filter.CharacterEncodingencodingutf-8chineseEncoding/*过滤器2该过滤器在处理方法中将参数直接进行解码操作然后将解码后的参数重新设置到request的attribute中。public class CharacterEncoding implementsFilter {protectedFilterConfig filterConfig ;String encoding null;public voiddestroy() {this.filterConfig null;}/*** 初始化*/public voidinit(FilterConfig filterConfig) {this.filterConfig filterConfig;}/*** 将 inStr 转为 UTF-8 的编码形式**paraminStr 输入字符串*returnUTF - 8 的编码形式的字符串*throwsUnsupportedEncodingException*/private String toUTF(String inStr) throwsUnsupportedEncodingException {String outStr ;if (inStr ! null) {outStr new String(inStr.getBytes(iso-8859-1), UTF-8);}returnoutStr;}/*** 中文乱码过滤处理*/public voiddoFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain)throwsIOException,ServletException {HttpServletRequest request(HttpServletRequest) servletRequest;HttpServletResponse response(HttpServletResponse) servletResponse;//获得请求的方式 (1.post or 2.get), 根据不同请求方式进行不同处理String method request.getMethod();//1. 以 post 方式提交的请求 , 直接设置编码为 UTF-8if (method.equalsIgnoreCase(post)) {try{request.setCharacterEncoding(UTF-8);}catch(UnsupportedEncodingException e) {e.printStackTrace();}}//2. 以 get 方式提交的请求else{//取出客户提交的参数集Enumeration paramNames request.getParameterNames();//遍历参数集取出每个参数的名称及值while(paramNames.hasMoreElements()) {String name paramNames.nextElement(); //取出参数名称String values[] request.getParameterValues(name); //根据参数名称取出其值//如果参数值集不为空if (values ! null) {//遍历参数值集for (int i 0; i values.length; i) {try{//回圈依次将每个值调用 toUTF(values[i]) 方法转换参数值的字元编码String vlustr toUTF(values[i]);values[i]vlustr;}catch(UnsupportedEncodingException e) {e.printStackTrace();}}//将该值以属性的形式藏在 requestrequest.setAttribute(name, values);}}}//设置响应方式和支持中文的字元集response.setContentType(text/html;charsetUTF-8);//继续执行下一个 filter, 无一下个 filter 则执行请求chain.doFilter(request, response);}}配置chineseEncodingcom.test.filter.CharacterEncodingchineseEncoding/*其他1、设置pageEncoding、contentType2、设置tomcat的URIEncoding在默认情况下tomcat服务器使用的是ISO-8859-1编码格式来编码的URIEncoding参数对get请求的URL进行编码所以我们只需要在tomcat的server.xml文件的标签中加上URIEncodingutf-8即可。,请尊重作者辛勤劳动成果,转载说明出处.
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922537.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!