乱码问题总结

 一、编码的基础概念

首先,要想解决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

三、常用的乱码解决方法



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

两类乱码:

java和jsp的源文件的保存方式是基于字节流的,如果编译的时候使用的编码方式和源文件不一样,就会产生乱码。在文件头加上<%@ page contentType=”text/html;charset=GBK”%>
2.java和其他存储媒介交互时产生乱码。很多存储媒介如数据库、文件、流等存储方式都是基于字节流的。Java和这些媒介交互时就会发生字符(char)与字节(byte)之间的转换。

两种方式:

使用string的字节码转换
进行字节码转换,破坏对象的封装性。

J2EE容器进行编码设置
不符合J2EE应用和容器分离的原则。



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

1.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>

复制代码



CharacterEncodingFilter.java:
复制代码

public class CharacterEncodingFilter implements Filter
{

protected String encoding = null;

public void init(FilterConfig filterConfig) throws ServletException
{
this.encoding = filterConfig.getInitParameter("encoding");
}

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

}

你可能感兴趣的:(0.)