`

开发中遇到的各种中文乱码

 
阅读更多

一般导致中文乱码问题7点因素:

    1.数据库使用的字符集 
    2.数据库表使用的字符集
    3.html、JSP 页面上的编码
    4.使用的JDBC  url连接是否正确
    5.web服务器端 应用服务器 和 操作系统 设置的字符集是否和你需要的匹配
    6.你的IDE开发环境(Eclipse)工程使用的字符集是否匹配
    7.检查你的工程的web.xml文件是否在使用关于字符编码的过滤器

 

JSP页面可以设置字符集的地方至少有下面两处的地方:

pageEncoding属性说明该jsp在web服务器编译成class的编码方式,

<meta content="utf-8">是说明浏览器需要用什么编码来解析该html文件

POST方式:

       参数是作为http的body来提交的,pageEncoding属性指定了提交到服务器的编码字符集。服务器端的tomcat默认是以 iso--8859-1字符集来解码,可以通过方法:

request.setCharacterEncoding("字符集");

来指定字符集来解码参数。jsp的pageEncoding和服务器端的 request.setCharacterEncoding字符集必须一致,否则就会产生乱码。

比如:上面的JSP的pageEncoding="UTF-8",服务器端就必须用 request.setCharacterEncoding("UFT-8")来指定接受字符集,然后用request.getParameter("参数")来接收参数,这样就不会出现中文乱码。

一般服务器端通过写一个filter来设置 request.setCharacterEncoding("UFT-8")达到简化的目的,比如spring的filterorg.springframework.web.filter.CharacterEncodingFilter。

 

GET方式:

假如没有指定jsp的form标签的method的属性,默认提交就是GET方式提交。或者直接指定属性method=“GET”。



 

GET方式提交参数是作为url的参数来提交的,而不是http的body。服务器端的方法request.setCharacterEncoding("UTF-8");对于GET方式提交的参数没有作用。因为servlet规范文档里面提到该方法的作用范围。

 

Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().

 

可以看出对于get方法他是无能为力的。那如何对GET方式提交的参数指定编码呢,可以在服务器里设置,tomcat可以如下设置:

 

  <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

 

URIEncoding属性设置了GET提交的参数的编码方式,假如不设置的话,默认是用 iso--8859-1来解码,

设置的URIEncoding属性必须跟JSP页面的pageEncoding指定的字符集一致,和<meta content="utf-8">的设置无关。

 

 

 

 

数数自己遇到的说到哪算哪(常更新)

这几天写了一个小模块,需要使用fckeditor,下载下来默认编码utf-8

只是我们的大项目是GBK的,而且resin也是使用的GBK,

这个问题最后的解决办法是:web.xml加了一个filter,当访问Fckeditor里边的所有东西就进行拦截,然后setEncoding为utf-8

 注意:GBK是在GB2312基础上扩充来的。

由于Java语言内部采用UNICODE编码,所以在JAVA程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格 式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,则显示出来的汉字就会出是乱码,这就是我们常见的JAVA中文问题。

几乎所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递,而不是按中文编码传递,所以,传递中文参数时也会有问题,从而带来乱码现象。

 

 

要查看系统的 file.encoding参数,可以用以下代码:
public class ShowSystemDefaultEncoding {
public static void main(String[] args) {
String encoding = System.getProperty(“file.encoding”);
System.out.println(encoding);
}}

JSP/Servlet页面的中文显示为乱码的问题可以细分为5类:
1. JSP页面显示乱码。
2. Servlet接收Form/Request传递的参数时显示为乱码
3. JSP接收Form/Request传递的参数时显示为乱码
4. 用<jsp:forward page="catalog2.html"></jsp:forward>时页面显示乱码
5. 数据库存取的时候产生乱码。
解决方式:
1. JSP页面显示乱码的解决方式:
第一种方式为在页面的开头加上:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<!--这里的 GBK可以由 gb2312代替,此处以GBK为例。下同 -->
注: 有时候如果不再页面开头加上这句,则页面中无法保存中文字符,并提示:中文字符在不能被iso-8859-1字符集mapped,这是由于默认情况下, JSP是用iso-8859-1来编码的,可以在Window->Preferences->General->Content Type选项下,在右边的窗口选择Text->Jsp,然后在下面的Default Encoding由默认的iso-8859-1改为GBK,然后点击update即可解决。
然而这 种方式会带来一些问题:由于这一句在其他文件include该文件的时候不能被继承,所以include它的文件也需要在文件开头加上这句话,此时如果用 的是pageEncoding="gbk"则会出现问题。类似于org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values
(old: text/html;charset=GBK, new: text/html;charset=gbk).
类似地,如果两个文件一个用的是gbk,一个用的是gb2312也会出现问题。
另一种更好的解决方式为:
在项目的web.xml中添加以下片段:
<!-- 下面的代码为解决页面乱码问题而加入 -->
<jsp-config>
            <jsp-property-group>
                <description>
                   Special property group for JSP Configuration JSP example.
                </description>
                <display-name>JSPConfiguration</display-name>
                      <url-pattern>*.jsp</url-pattern>
                <el-ignored>true</el-ignored>
                <page-encoding>GBK</page-encoding>
                <scripting-invalid>false</scripting-invalid>
                <include-prelude></include-prelude>
                <include-coda></include-coda>
            </jsp-property-group>            
            <jsp-property-group>
                <description>
                   Special property group for JSP Configuration JSP example.
                </description>
                <display-name>JSPConfiguration</display-name>
                <url-pattern>*.html</url-pattern>
                <el-ignored>true</el-ignored>
                <page-encoding>GBK</page-encoding>
                <scripting-invalid>false</scripting-invalid>
                <include-prelude></include-prelude>
                <include-coda></include-coda>
            </jsp-property-group>
</jsp-config>

2. Servlet接收Form/Request传递的参数时显示为乱码的解决方式:
第一种解决方式为在用到request方法的前面加上这条语句:
request.setCharacterEncoding("GBK");
同样地,这也会由于页面设置中GbK或gB2312大小写不同或者采用不同的汉语字符集而发生错误。
另一种更好的解决方式为:添加一个名为SetCharacterEncodingFilter的filter。
filter的源文件为(参见apach安装目录下/webapps/jsp-examples/WEB-INF/classes/filters中的SetCharacterEncodingFilter.java文件):

package com.filters;import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
public class SetCharacterEncodingFilter implements Filter {

         protected String encoding = null;
         protected FilterConfig filterConfig = null;
         protected boolean ignore = true;
         public void destroy() {
             this.encoding = null;
             this.filterConfig = null;
         } 
          public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
          throws IOException, ServletException   {
             if (ignore || (request.getCharacterEncoding() == null)) {
                 String encoding = selectEncoding(request);
                 if (encoding != null)
                     request.setCharacterEncoding(encoding);
             }
// Pass control on to the next filter
             chain.doFilter(request, response);
         }

        public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
             this.encoding = filterConfig.getInitParameter("encoding");
             String value = filterConfig.getInitParameter("ignore");
             if (value == null)
                 this.ignore = true;
             else if (value.equalsIgnoreCase("true"))
                 this.ignore = true;
             else if (value.equalsIgnoreCase("yes"))
                 this.ignore = true;
             else
                 this.ignore = false;
         }
           protected String selectEncoding(ServletRequest request) {
             return (this.encoding);
         }

}
<filter>
             <filter-name>SetCharacterEncoding</filter-name>
             <filter-class>com.filters.SetCharacterEncodingFilter</filter-class>
             <init-param>
                 <param-name>encoding</param-name>
                 <param-value>GBK</param-value>
             </init-param>
          </filter>
         <filter-mapping>
             <filter-name>SetCharacterEncoding</filter-name>
             <url-pattern>/*</url-pattern>
        
</filter-mapping>

3. JSP接收Form/Request传递的参数时显示为乱码
当 我们按照第二种乱码的解决方式修改了web.xml并添加了filter之后,有时候并不一定就对乱码问题高枕无忧了,有时候我们会奇怪的发现 Sevlet接收Form/Request传递的参数可以正常显示了,但是jsp页面接受Form/Request传递的参数却仍然显示为乱码。这是为什 么呢?
对于我遇到的情况而言,我发现是由于我在用Form发送信息的页面采用了这样的html:
<form action="getParam.jsp" >
姓名<input type="text" name ="UserName"> <br>
选出你喜欢吃的水果:
<input type ="checkbox" name = "checkbox1" value = "苹果"> 苹果
<input type ="checkbox" name = "checkbox1" value = "西瓜"> 西瓜
<input type ="checkbox" name = "checkbox1" value = "桃子"> 桃子
<input type ="checkbox" name = "checkbox1" value = "葡萄"> 葡萄
<input type = "submit" value = "提交">
</form>
也就是说没有指定form的method属性。而问题就发生在此,Form的默认mothod属性为get.
而get是通过在发送请求的url后面加?然后加参数和值来传递数据的的,编码格式为ASCII.这就要求我们在传递的数据中有非ASCII字符或是超过了100个字符,那么你必须使用method="post",否则就会出现乱码。
所以解决方式为:第二种乱码的解决方式+在发送页面的Form中指定method为post.
4. 用<jsp:forward page="catalog2.html"></jsp:forward>时页面显示乱码的解决方式
此 时实际上乱码的原因和产生其他几种乱码的原因不同,它的原因在于我们用eclipse编辑要forward的html或者jsp文件时,采用的编码是可以 产生中文乱码的编码而不是GBK或者GB2312.所以解决方式就是把eclipse编辑器的编码方式改为GBK或者GB2312.
具体操作方式见:上文红色字体部分。
5. 数据库存取的时候产生乱码的解决方式
当然,在写数据库时,也要保正数据库的编码与其它一致:
我们可以在系统盘windows目录下的my.ini文件,在文件中插入一行default-character-set=GBK,但上面说了这么多,大家也应该明白些了吧,改动太多的默认设置不是我的风格,因此上,这一行还是不要加的好。
但不管怎么样,我们还是要创建一个基于中文编码的数据库,当然,用客户端登录的时候,某些客户用自动把字体编码转换成中文编码。在这里,我想说一下在DOS下创建中文编码数据库的方法:
在进入数据库的时候,用mysql --default-character-set=gbk -u root -p 这句话进入mysql,然后创建数据库,如:create database admin;这样创建起来的数据库就是基于中文编码的了。用连接数据库的时候,读出的数据也可能是乱码,解决这个问题的方法非常简单,只要在你建立数据库连接的时候把URL设置成 下面这个样子就可以了:URL= jdbc:mysql://localhost:3306/my_database?useUnicode=true&characterEncoding=GBK
好了,说了这么多,总结一句话结束吧,把各种地方的编码统一起来,那么,所在的乱码问题就都解决了!

分享到:
评论

相关推荐

    中文乱码javaWEB开发各种解决中文乱码问题

    在Java Web开发过程中,中文乱码问题是开发者经常遇到的一个挑战。中文字符的正确显示与处理涉及到编码、解码以及服务器配置等多个环节,若任一环节处理不当,都可能导致中文字符显示为乱码。本文将详细探讨Java Web...

    在eclipse中中文汉字乱码的解决方案

    Eclipse 是一个功能强大且广泛使用的集成开发环境(IDE),但是在使用过程中,用户可能会遇到中文汉字乱码的问题。本文将为大家分享解决 Eclipse 中中文汉字乱码的方案,以便大家更好地使用 Eclipse。 一、问题描述...

    express中文乱码解决

    在Web开发中,尤其是使用Node.js的Express框架进行后端开发时,处理中文字符可能会遇到乱码问题。这通常是因为客户端与服务器之间的编码设置不一致导致的。本文将详细介绍如何在Express应用中解决中文乱码问题,包括...

    C# 将中文乱码转换成中文

    当我们在不同的系统或网络环境中传输或存储文本时,可能会遇到字符编码不一致导致的中文乱码问题。本文将深入探讨如何使用C#语言解决中文乱码问题,将乱码文本正确转换为可读的中文。 ### 核心知识点:字符编码与...

    android二维码开发 ZXing(中文乱码已处理)

    开发过程中,可能遇到各种问题,如权限未获取、相机无法打开等。这时,可以通过日志输出、异常捕获等方式进行调试,确保应用的稳定性和用户体验。 以上是关于"android二维码开发 ZXing(中文乱码已处理)"的相关知识...

    中文乱码问题

    中文乱码问题是 web 开发中经常遇到的问题,特别是在使用 JSP、Servlet、Struts 2 等技术时。乱码问题的出现主要是由于字符编码不一致所致。以下是解决中文乱码问题的知识点: JSP 文件的中文乱码问题 在 JSP 文件...

    解决中文乱码问题

    部分内容中展示了使用C#语言读取txt文件时,遇到中文乱码的问题。解决方法是使用StreamReader对象,并指定参数为UnicodeEncoding.GetEncoding("GB2312")。这样可以正确地读取txt文件中的中文字符。 知识点1:...

    sqlite3 for delphi 解决中文乱码问题

    在使用SQLite3数据库引擎与Delphi集成开发过程中,经常遇到的一个挑战是中文字符显示为乱码。"sqlite3 for delphi 解决中文乱码问题"这个主题,正是针对这一问题提供了解决方案。这里我们将详细探讨SQLite3在Delphi...

    WebSevice 中文乱码

    在IT领域,尤其是在Web开发中,遇到中文乱码问题是一个常见的挑战,特别是在处理WebService时。本文将深入探讨“WebSevice中文乱码”的问题,包括其产生的原因、影响以及解决方案,帮助开发者更好地理解和应对这一...

    Java WEB开发中的中文乱码问题解决方法.pdf

    在Java Web开发中,中文乱码...通过以上设置,可以在很大程度上避免在Java Web开发过程中遇到的中文乱码问题。当然,每个项目具体情况可能不同,需要根据实际情况灵活调整编码设置,以达到最佳的编码兼容性和一致性。

    java中文乱码之解决URL中文乱码问题的方法

    在Java开发中,遇到中文乱码问题是一种常见的挑战,特别是在处理URL时。URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要...

    Json操作及中文乱码解决方案

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web开发中,用于在客户端和服务器之间传输数据。...在实际开发中,遇到乱码问题时,检查请求和响应的编码设置是解决问题的关键。

    中文乱码处理问题总结

    本文将重点讨论在Java环境下,特别是Web应用开发中遇到的中文乱码问题,并提出相应的解决方案。 #### 二、JSP页面中的乱码处理 1. **JSP页面本身的编码设置** - **问题描述**:JSP页面直接输出中文时可能出现...

    java android zip解压缩(解决压缩中文乱码问题)

    然而,当压缩文件包含中文字符时,解压缩过程中可能会遇到乱码问题。这是因为编码格式不匹配或者处理方式不当导致的。本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 ...

    LINUX SSH显示中文乱码解决

    然而,一个常见的问题是当我们在Windows环境下使用SSH客户端(如PuTTY等)连接到Linux服务器时,可能会遇到中文字符显示为乱码的情况。这不仅影响了阅读体验,还可能对系统的维护和开发工作造成不便。本文将详细介绍...

    配置web-xml解决中文乱码问题.pdf

    本文主要讨论了在 Web 开发中遇到的中文乱码问题,并提供了一些解决方案。首先,需要确定中文乱码问题不是由浏览器引起的,然后讨论了 Tomcat 服务器配置和数据库 bean 配置中的一些解决方案。 一、浏览器配置问题 ...

    sourceInsight3.5 及中文乱码解决

    然而,在处理含有中文字符的代码时,可能会遇到中文乱码的问题,这无疑给开发工作带来不便。本文将详细解析如何解决Source Insight 3.5中的中文乱码问题。 首先,我们需要了解为何会出现中文乱码。在ASCII编码系统...

    RedHat中文乱码解决方案

    在IT行业中,操作系统是开发和工作的重要平台,而Red Hat作为一款广受欢迎的企业级Linux发行版,有时会遇到中文字符显示不正常,即中文乱码的问题。这个问题对程序员和其他需要处理中文内容的用户来说确实非常棘手。...

Global site tag (gtag.js) - Google Analytics