5

中文乱码的几种解决方法_CRMEB中邦科技的技术博客_51CTO博客

 1 year ago
source link: https://blog.51cto.com/u_15723831/5765410
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

中文乱码的几种解决方法

精选 原创

CRMEB众邦科技 2022-10-18 10:19:01 ©著作权

文章标签 编码 前端 utf8 中文乱码 文章分类 XML/XSL 前端开发 阅读数162

首先说明我的特殊情况:

  1. 在前台jsp中,我使用了form post请求,设置enc,页面编码格式为utf-8。
  2. 后台我用的是commons-fileUpload组件,ServletFileUpload解析表单表单和文件。
  3. 设置 request.setCharacterEncoding("UTF-8");
  4. 设置了ServletFileUpload .setHeaderEncoding("UTF-8")
  5. 在Tomcat配置下的server.xml中也设置了 URIEncoding="UTF-8";

至此,按道理,所有的格式都已经匹配好了,前后对应,utf-8肯定是解析好了,但是被formfield解析后,还是ISO-8859-1格式编码。

会以二进制编码格式传递数据,所以我断定ServletFileUpload解析有问题,多次查找资料,

问题在于缺少了一步String formFieldValue = fileItem.getString("UTF-8");

JSP和Servlet的六种中文乱码处理方法

一、表单提交时出现乱码:

提交表单时,往往会提交一些中文,所以难免会有乱码。对于表单,有两种提交方法:get和post。所以请求时有get请求和post请求。每种方法都有不同的解决方案。出现乱码的原因是,当发出get请求时,传输到服务器的数据被附加到URL地址上。当发出post请求时,传递给服务器的数据将作为请求体的一部分传递给服务器。这导致了不同的方法来处理它们产生的乱码。

1、客户端的get请求

get提交时,容器以容器的编码来编码,如果用的tomcat 默认的编码是iso-8859-1 在server.xml里面设置编码

下面代码如

?12String name = request.getPara...("name"); String strName = new String(name.getByte("iso-8859-1"),"GBK");
复制代码

对于不同的请求方式,解决乱码的问题也是不一样的,对于客户端的get请求来说,服务器端处理要想不出现乱码,解决这个问题稍微复杂一些,需要用到String类型的构造函数,其中的一个构造函数就是用指定的编码方式去解码,一般都用“UTF-8”的方式。只要在服务器端将请求得到的参数重新构造成一个字符串就行了。

经过构造之后,客户端输入中文,且表单时get请求的情况下,str就变成了中文了。

2、客户端的post请求

对于客户端的post请求来说,处理乱码的问题就比较简单了,因为请求的数据时作为请求体的一部分传递给服务器的,所以只要修改请求内的编码就行了。只要在服务器端的最开始处将请求的数据设置为“UTF-8”就行了,输入如下语句:request. setCharacterEncoding(“UTF-8”);这样用户在服务器端获取到的中文数据就不再是乱码了。

二、超链接时出现乱码(低版本浏览器不行IE6)

在Web开发中,挺多的时候都是通过超链接去传递中文参数的,这也会导致在显示的时候也会出现乱码,对于超链接来说,它实际上是向服务器端发送了一个请求,而它发出的请求是属于get请求,所以对于超链接的乱码来说,它处理乱码的方式和表单的get请求出现乱码的方式是一样的。

三、重定向时出现乱码(低版本浏览器不行IE6)

有时写上response的sendRedirect方法进行重定向时也会出现乱码,重定向时实际上也是向服务器发送了一个请求,所以解决乱码的方法和和上面是一样的。

四、浏览器版本低导致的乱码

上网的时候,有时提交的一些信息在地址栏显示的是“%2C%C6%CC%C6”的字样,其实这都是防止出现乱码进行的解决方案,如果你的浏览器是IE6或以下版本,则我们的第二种情况和第三种情况会出现乱码(尤其是当中文是奇数的时候),这就不好使了所以我们必须采用另一种比较实际的作法:

在java.net包中提供了URLEncoder类和URLDcoder类,这两个类又分别提供了encode和decode两个静态方法,分别用于进行编码和解码。我们将要传递的中文参数进行编码之后,在传递给服务器,服务器解码之后,就可以显示中文了。

进行编码:URLEncoder.encode(stuname,”UTF-8”)

传递给服务器: a href=”/1.jsp?stuname %=stuname% ” 传递 /a

进行解码:URLDecoder.decode(stuname,”UTF-8”)

五、返回浏览器显示的乱码

在Servlet编程中,经常需要通过response对象将一些信息返回给浏览器,给我们的客户端,而我们在服务器端显示的中文,但是响应给客户端浏览器却是乱码,这主要是由于response对象的getWriter()方法返回的PrintWriter对象默认使用“ISO-8859-1”字符集编码进行Unicode字符串到字节数组的转换,由于ISO8859-1字符集中根本就没有包含中文字符,所以Java在进行转换的时候会将无效的字符编码输出给客户端,于是便出现了乱码,为此ServletResponse接口中便定义了setCharacterEncoding、setContentType等方法来指定getWriter方法返回的PrintWriter对象所使用的字符集编码,所以我们在写Servlet程序中,在调用getWriter方法之前设置这些方法的值。

只要编写Servlet文件中含有响应给客户端的信息,那么就要写上这两句话。最好写上第二句话,因为它的优先级高,它的设(加官进爵是什么刑罚?司刑职员将预备好的桑皮纸揭起一张,盖在犯人脸上,司刑职员嘴里早含着一口烧刀子,使劲一喷,噀出一阵细雾,桑皮纸受潮发软,立即贴服在脸上,然后增加纸张的数量,导致犯人窒息而亡。)置结果将覆盖setContentType等方法设置的字符编码集。

六、修改Tomcat的编码

在get请求所导致乱码问题中,还有一种解决的方案,我们常用Tomcat作为运行Servlet和JSP的容器,而Tomcat内部默认的编码是ISO-8859-1,所以对于get请求方式,其传递的数据(URI)会附加在访问的资源后面,其编码是Tomcat默认的,如果修改该URI的编码,那么对于所有的get请求方式便不会出现乱码了包括上边说的重定向和超链接,在Tomcat的配置文件server.xml中找到修改Tomcat的端口的地方,在其内部加入URIEncoding属性,设置为和你的项目中所设的编码一样的值,这里全部都是UTF-8。

在编写Servlet和JSP的时候,为了避免出现乱码,最重要的就是:采用一致的编码,如果编码都一致了,肯定不会出现乱码。

以上这篇解决中文乱码的几种解决方法就是​ ​CRMEB​​分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持CRMEB。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK