Java中乱码问题汇总

 

1表单使用Post方式提交后接收到的乱码问题

这个问题也是一个常见的问题。这个乱码也是tomcat的内部编码格式iso8859-1在捣乱,也就是说post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。导致乱码。既然这样的原因,下面有几种解决方式,并比较。

A 接受参数时进行编码转换

String str = newString(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8")这样的话,每一个参数都必须这样进行转码。很麻烦。但确实可以拿到汉字。

B 在请求页面上开始处,执行请求的编码代码,request.setCharacterEncoding("UTF-8"),把提交内容的字符集设为UTF8。这样的话,接受此参数的页面就不必在转码了。直接使用String str=request.getParameter("something");即可得到汉字参数。但每页都需要执行这句话。
这个方法也就对post提交的有效果,对于get提交和上传文件时的enctype="multipart/form-data"是无效的。稍后下面单独对这个两个的乱码情况再进行说明。

C 为了避免每页都要写request.setCharacterEncoding("UTF-8"),建议使用过滤器对所有jsp进行编码处理。这个网上有很多例子。请大家自己查阅。

 

表单post方式提交也可以使用过滤器来解决:

 

 

2 表单get提交方式的乱码处理方式。
如果使用get方式提交中文,接受参数的页面也会出现乱码,这个乱码的原因也是tomcat的内部编码格式iso8859-1导致。Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,导致接受页面得到的参数为乱码/、。

解决办法:

A 使用上例中的第一种方式,对接受到的字符进行解码,再转码。

 

前台页面需要编码后再发送:

url=”????/param=”+URLEncoder.encode(“param”,”UTF-8”);//编码

服务器接受url 需要解码:

Stirngurl=URLDecoder.decode(request.getParameter(“param”),”UTF-8”);


B Get走的是url提交,而在进入url之前已经进行了iso8859-1的编码处理。要想影响这个编码则需要在myEclipse工程栏下的servers下的server.xmlConnector节点增加useBodyEncodingForURI="true"属性配置,即可控制tomcatget方式的汉字编码方式,上面这个属性控制get提交也是用request.setCharacterEncoding("UTF-8")所设置的编码格式进行编码。所以自动编码为utf-8,接受页面正常接受就可以了。但我认为真正的编码过程是,tomcat又要根据

<Connector port="8080"

maxThreads="150" minSpareThreads="25"maxSpareThreads="75"

enableLookups="false" redirectPort="8443"acceptCount="100"

debug="0" connectionTimeout="20000"useBodyEncodingForURI="true"

disableUploadTimeout="true" URIEncoding=”UTF-8”/>

里面所设置的URIEncoding=”UTF-8”再进行一次编码,但是由于已经编码为utf-8,再编码也不会有变化了。如果是从url获取编码,接受页面则是根据URIEncoding=”UTF-8”来进行解码的。

 

3上传文件时的乱码解决

   上传文件时,form表单设置的都是enctype="multipart/form-data"。这种方式以流方式提交文件。如果使用apach的上传组件,会发现有很多乱码想象。这是因为apach的先期commons-fileupload.jarbug,取出汉字后进行解码,因为这种方式提交,编码又自动使用的是tomcat缺省编码格式iso-8859-1。但出现的乱码问题是:句号,逗号,等特殊符号变成了乱码,汉字如果数量为奇数,则会出现乱码,偶数则解析正常。

     解决方式:下载commons-fileupload-1.1.1.jar这个版本的jar已经解决了这些bug。但是取出内容时仍然需要对取出的字符进行从iso8859-1utf-8转码。已经能得到正常所有汉字以及字符。

 

4 Java代码关于url请求,接受参数的乱码

url的编码格式,取决于上面所说的URIEncoding=”UTF-8”如果设定了这个编码格式,则意味着所
有到url的汉字参数,都必须进行编码才可以。否则得到的汉字参数值都是乱码,例如
一个链接 Response.sendDerect“/a.jsp?name=张大维);而在a.jsp里面直接使用
String name");得到的就是乱码。因为规定了必须是utf-8才可以,所以,这个转向应该这样写: 
    
Response.sendDerect“/a.jsp?name=URLEncode.encode(“张大维”,”utf-8”)才可以。
如果不设置这个参数URIEncoding=”UTF-8”会怎么样呢? 不设置则就使用了缺省的编码格式iso8859-1。问题又出来了,第一就是参数值的个数如果是奇数个数,则就可以正常解析,如果是偶数,得到最后字符就是乱码。还有就是如果最后一个字符如果是英文,则就能正常解析,但中文的标点符号仍出现乱码。权宜之计,如果您的参数中没有中文标点符号,则可以在参数值最后加一个英文符号来解决乱码问题,得到参数后再去掉这个最后面的符号。也可以凑合使用。

 

 

 

 

5 servlet实现下载 中文文件名乱码报错的问题:

在tomcat (即相对应的Servers)中的server.xml文件中的

<ConnectorconnectionTimeout="20000" port="8080"protocol="HTTP/1.1" redirectPort="8443" />

中加入

useBodyEncodingForURI="true"

或者

URLDecoder.decode()

 

 

6 servlet实现验证中文用户名乱码报错的问题:

在tomcat (即相对应的Servers)中的server.xml文件中的

<ConnectorconnectionTimeout="20000" port="8080"protocol="HTTP/1.1" redirectPort="8443" />

中加入

useBodyEncodingForURI="true"  (注意是uri 不是url

或者

URLDecoder.decode()

 

 

7 在servlet传递数据到ajax上发生中文乱码的解决方法

printWriterout=response.getWriter()之前加上一句:

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

 

 

8 在servlet上传递json到流上,出现乱码

PrintWriterwriter = response.getWriter();

         writer.write(json);之前加上:

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

 

 

9 字符串如何转码:

String str = "你好";

byte[] b = str.getBytes("utf-8");

String str1 = new String(b, "UTF-8");

 

 

10 前台页面传递url给服务器时,url携带的参数出现乱码:

前台页面需要编码后再发送:

url=”????/param=”+URLEncoder.encode(“param”,”UTF-8”);//编码

服务器接受url 需要解码:

Stirngurl=URLDecoder.decode(request.getParameter(“param”),”UTF-8”);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值