乱码问题

来源:互联网 发布:深圳软件产业园 编辑:程序博客网 时间:2024/06/10 07:28

1.Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

  ContentType属性指定响应 HTTP内容类型。如果未指定 ContentType,默认为TEXT/HTML

下面的示例将 ContentType属性设置为其他的常见值。

<% Response.ContentType = "text/HTML" %>

<% Response.ContentType = "image/GIF" %>

<% Response.ContentType = "image/JPEG" %>

2.pageEncodingjsp文件本身的编码

contentTypecharset是指服务器发送给客户端时的内容编码

JSP要经过两次的编码,第一阶段会用pageEncoding,第二阶段会用utf-8utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType

第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

第二阶段是由JAVACJAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8encodingjava源码。

3.对字符串进行编码和解码:

String str = "张三" ;  

byte[] jiema= str.getBytes("gb2312") ; //解码  

String   bianma = new String(jiema,"UTF-8");//编码 如果上面的解码不对 可能出现问题  

解码这个必须知道是什么码才能解了,页面ajax传值的编码是iso8859-1

3. 请求响应的编码request.setCharacterEncoding("utf-8");

4. response.setContentType("text/html;charset=utf-8");

5. 关于ie文件上传的文件名乱码问题,解决办法:

fileName = java.net.URLEncoder.encode(fileName,"ISO-8859-1");可以设置成ISO-8859-1编码解决。

6.转码

String name 

  =request.getParameter("name")==null?"":URLDecoder.decode(request.getParameter("name"),"utf-8");//分类名称

 

 

7.乱码问题

1. var name=document.myForm.username.value;  

2. var url="Ajax.do?method=check&name="+encodeURI(encodeURI(name));  

3. xmlHttp.open("GET",url,true);  

4. action中  

5. String name = request.getParameter("name");  

6. name = URLDecoder.decode(name, "UTF-8");  

7. //servlet返回数据时,将字符编码设置为utf-8就可以了,因为Ajax只支持utf-8  

8. response.setContentType("text/xml;charset=utf-8");  

9. PrintWriter out = response.getWriter();  

10. out.print(result);  

 

7.处理请求参数传递编码问题:

 

java中编码:URLEncoder.encode(strUri,"utf-8");
java中解码码:URLDecoder.decode(strUri,"utf-8");

8.js中编码:

encodeURIComponent(strUri);encodeURI(strUri);escape(str);

 js中解码:

decodeURIComponent(strUri);decodeURI(strUri);unescape(str);

 

9.各种情况的乱码

jsp与页面参数之间的乱码

强制指定request获取编码的方式:request.setCharacterEncoding(“GBK”)

如果jsp输出到页面出现乱码:response.setCharacterEncoding(“GBK”)

或者在web.xml中配置servlet过滤器filter

web.xml:

<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>net.vschool.web.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

10.2.java与数据库之间的乱码

直接使用unicode与数据库进行交互,可以在驱动的url中指定,如mysql驱动:

Jdbc:mysql://localhost/SRC?useUnicode=true&characterEncoding=GBK

3.java与文件流之间的乱码

FileInputStream/FileOutpuStream是基于字节流(byte)的,常用于读写二进制文件。

FileReader/FileWriter是基于字符(char)的。这两个类的构造函数默认使用系统的编码。

使用它们的父类InputStreamReader/ OutputStreamWriter可以指定编码类型。

InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)

四、解决乱码问题的注意事项

 

1.一个新的系统,从页面到数据库再到配置文件,建议统一使用UTF-8

2.setCharacterEncodingFilter只对post请求有效,get一律忽略

3. JavaScript和Ajax乱码的避免,注意JavaScript默认是ISO8859的编码,避免JS/AJAX乱码和GET一样,不要在 URL里面使用中文,实在避免不了,就只能在生成链接的时候转码,绝对不能想当然的认为SetCharacterEncodingFilter会帮你做什 么事情。

4. 如果在本项目中采用了get方式提交请求并附加参数,结果导致编码乱码,原因是Tomcat默认请求编码是ISO8859,需要在Tomcat的配置文件 server.xml添加一个参数,URIEncoding=”UTF-8”,这样请求中附件的参数就会以UTF-8来进行编码。

5.Ajax请求乱码 使用Ajax,JS也是默认使用ISO8859编码,所以在进行请求时遇到中文参数需要进行编码,如:var url = "GetSelectListAction.do?queryData=subTrade" + "&queryId=" + encodeURI(obj.value) + "&r=" + Math.random();这里有两个地方需要注意:第一个地方是encodeURI(),方法,可以将参数进行转码,默认是转化为UTF-8,如果需要转为其他码制,需要在方法中添加第二个参数。第二个地方是Math.random(),由于Ajax有缓存机制,在接受请求的时候第一时间先判断该请求的地址是否被访问过,如果被访问过则 直接使用缓存中的内容返回,这个东西很讨厌,客户在访问过一次出错后以后每次出现的都是这个错误,所以在请求中给其增加一个时间戳,只要可以随机生成一个 不同的字串就可以,保证Ajax每次都去访问服务器。

5.超长汉字Get乱码

超长的汉字做为参数传递仍然会出现乱码问题,解决方法是采用java.net.URLEncoder的 Encode方法强制转码:

<a href="TestAction.do?name=<%= java.net.URLEncoder.encode("你好","UTF-8")%>

 

1.web.xml配置文件里过滤器设置:

<filter>

<filter-name>characterEncodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>characterEncodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

2.页面乱码

页面乱码的情况除了页面里没有设置编码外,还有可能就是文件本身的编码乱码(中文)了。



原创粉丝点击