3

乱码问题解决_mb62c3ac8538829的技术博客_51CTO博客

 1 year ago
source link: https://blog.51cto.com/u_15707781/5568883
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.

乱码问题解决

原创
/*
*作者:呆萌老师
*☑csdn认证讲师
*☑51cto高级讲师
*☑腾讯课堂认证讲师
*☑网易云课堂认证讲师
*☑华为开发者学堂认证讲师
*☑爱奇艺千人名师计划成员
*在这里给大家分享技术、知识和生活
*各种干货,记得关注哦!
*/

乱码问题一直困扰着开发人员: 下面对java的乱码问题做一个小结:

一、编码的基础概念

首先,要想解决java中文乱码问题就有必要了解一下什么是字符,字符集,编码的概念。字符:是文字与符号的总称,包括文字、图形符号、数学符号等。字符集:就是一组抽象字符的集合。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。繁体汉字字符集、日文汉字字符集等等。 计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码: 制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。通常所说的字符集大多是这个含义。

二、常用的编码方式

其次,要想解决java中文乱码问题也得了解一下我们常用的编码方式:ASCII编码是目前计算机中用得最广泛的字符集及其编码。ISO8859-1可以表示的是西欧语言。看起来很单一为什么还在使用呢?,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。 而且在很多协议上,默认使用该编码。Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。通常我们所遇到过多UTF-8这是Unicode编码的实现方式,请一定要加以区分。GB2312字集是简体字集;BIG5字集是台湾繁体字集;GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号GB18030是国家制定的一个强制性大字集标准,它的推出使汉字集有了一个统一的标准。Linux系统默认使用的是ISO-8859-1编码,Win32系统默认使用的是GB2312编码。

Java的内核和class文件是基于unicode

三、常用的乱码解决方法 

统一系统的输入、输出和操作系统是解决乱码的基本方法,产生乱码的根本问题是字节与字符的转换过程中,你必须知道原来字节和转换后的字节的编码方式。

两类乱码:

1.java和jsp的源文件的保存方式是基于字节流的,如果编译的时候使用的编码方式和源文件不一样,就会产生乱码。在文件头加上<%@ page contentType=”text/html;charset=UTF-8”%>

2.java和其他存储媒介交互时产生乱码。很多存储媒介如数据库、文件、流等存储方式都是基于字节流的。Java和这些媒介交互时就会发生字符(char)与字节(byte)之间的转换。 

这种应用出现乱码的解决办法:

1.jsp与页面参数之间的乱码

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

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

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

web.xml:

<filter>

<filter-name>CharacterEncodingFilter</filter-name>

<filter-class>com.test.filter.CharacterEncodingFilter</filter-class>

<init-param>

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

<param-value>utf-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>CharacterEncodingFilter</filter-name>

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

</filter-mapping>

CharacterEncodingFilter.java:

Public class CharacterEncodingFilter implements Filter
{

Protected String encoding =null;

Public void init(FilterConfig filterConfig)throwsServletException
{

this.encoding = filterConfig.getInitParameter("encoding");
}

Public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throwsIOException, ServletException
{
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
}

}

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")%>

更多了解:

 ​ https://edu.51cto.com/course/20519.html​


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK