一、编码的基础概念
首先,要想解决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);
}
}
复制代码
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")%>
分享到:
相关推荐
struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结
Java开发乱码问题解决方法汇总 ...Java开发乱码问题解决方法汇总中,我们总结了七种常见的解决方法。这些方法可以帮助读者避免乱码问题的发生。如果读者在实际开发中遇到乱码问题,可以尝试使用这些方法来解决问题。
本文主要总结了五个方面可能导致的乱码问题及解决方案,帮助开发者们更好地理解和解决这些问题。 #### 一、HTML 页面转UTF-8 编码问题 1. **元数据标签**:确保在`<head>`标签内,在`<title>`标签之前添加`;...
总结来说,Android的乱码问题主要涉及URL、文件名和源代码等场景,关键在于正确处理字符编码的转换。了解各种编码方式,掌握如何在Java和Android中进行编码转换,以及熟悉相关工具的使用,都将有助于我们有效地解决...
HTML页面乱码问题是一个常见的开发痛点,特别是在处理多种编码格式时。本文将深入探讨这个问题,以便更好地理解和解决这类问题。 首先,我们需要理解编码的基础知识。字符编码是用来将字符(如字母、数字、符号)...
在Windows 10系统上使用Qt5.8.0进行编程时,常常会遇到中文乱码的问题,这些问题主要表现在代码中的中文注释和字符串显示乱码、编译输出信息乱码以及保存文件时中文路径乱码。这些问题产生的根本原因在于Windows系统...
中文乱码问题分析 中文乱码问题是 Java 和 JSP 开发中的一种常见问题,主要是由于 Java 和 JSP 源文件的保存方式是基于字节流的,而编译成 class 文件过程中,使用的编码方式与源文件的编码不一致所致。在 Java ...
总结来说,解决Ajax URI乱码问题的关键在于理解和匹配浏览器的编码行为,并在服务器端进行相应的配置。通过以上策略,可以有效地解决大部分浏览器的乱码问题,实现更好的跨浏览器兼容性。然而,对于特定情况,可能还...
### 中文乱码处理问题总结 #### 一、引言 在进行中文字符处理时,经常会出现乱码问题。这主要是因为不同的系统、程序或组件可能采用不同的编码方式,而这些编码方式之间的转换不当就会导致乱码现象。本文将重点...
### JS出现乱码问题介绍大全 #### 一、引言 在Web开发中,字符编码问题经常困扰开发者,特别是当涉及到不同语言环境时。JavaScript作为前端开发的核心技术之一,在处理字符编码方面同样会遇到各种各样的乱码问题。...
### Servlet + Tomcat 中文乱码问题解析及解决方案 #### 一、中文乱码问题概述 在使用Servlet和Tomcat进行Web开发时,经常会遇到中文乱码的问题。这主要是因为客户端(如浏览器)与服务器之间使用的字符编码不一致...
在IT行业中,尤其是在Web开发领域,JSP(JavaServer Pages)是常见的动态网页技术,而中文乱码问题一直是开发者们经常遇到的困扰。...希望这个总结能帮助到大家,减少在查找和调试这类问题上花费的时间。
总结,Netty中的进制转换乱码问题通常源于字符编码不一致或处理不当。解决此类问题的关键在于确保数据的发送和接收端都采用相同的字符编码,正确使用ByteBuf的方法进行读写,并可能需要自定义解码逻辑。通过仔细的...
### log4j乱码问题解决办法 #### 一、引言 在开发过程中,日志记录是必不可少的一个环节。良好的日志系统可以帮助开发者快速定位问题并进行调试。Log4j作为一款广泛使用的Java日志框架,在很多项目中扮演着重要...
### Struts框架中的乱码问题解析与解决方案 #### 背景介绍 在Web开发过程中,尤其是使用Java Web框架如Struts进行项目开发时,经常遇到的一个问题是中文字符的乱码问题。这个问题主要体现在中文字符在Web页面上的...
在IT领域,特别是Web开发中,Struts框架作为Java Web应用的一个重要组成部分,其在处理中文字符时常常遇到乱码问题。这个问题不仅影响了用户体验,也增加了开发者的调试难度。本文将深入探讨Struts框架中中文乱码的...