Java中文乱码问题(转)

解决JSP中文乱码问题

 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着大家,现把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。首先了解一下Java中文问题的由来:

Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312或-ecoding UTF-8编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或

<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。

 

下面是一些常见中文乱码问题的解决方法(下面例子中ecoding采用的是gb2312,也可设为ecoding GBK或ecoding UTF-8):

一、 JSP页面乱码

这种乱码问题比较简单,一般是页面编码不一致导致的乱码,一般新手容易出现这样的问题,具体分以下两种情况:

Ø 未指定使用字符集编码

下面的显示页面(display.jsp)就出现乱码:

 

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html charset=gb2312">

</head>

<body>

<%out.print("JSP的中文处理");%>

</body>

</html>


 

这种乱码的原因是没有在页面里指定使用的字符集编码,JSP页面中出现了中文字符,而默认的ISO-8859-1字符集中无中文字符,解决方法:只要在页面开始地方用下面代码指定字符集编码即可,在JSP页面中指定编码方式(gb2312),和浏览器解码方式设置相同,即在页面的第一行加上:

<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。

完整页面如下:

<%@ page contentType="text/html; charset=gb2312"%>

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html charset=gb2312">

</head>

<body>

<%out.print("JSP的中文处理");%>

</body>

</html>


 

Ø 编码字符集设置不一致

下面的显示页面(display.jsp)就出现乱码:

 

<%@ page language="java" pageEncoding="gb2312"%>

<%@ page contentType="text/html;charset=iso8859-1"%>

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html charset=gb2312">

</head>

<body>

<%out.print("JSP的中文处理");%>

</body>

</html>


 

这个出现乱码原因是由于页面编码不一致导致的乱码,在这个例子中我们可以看到有三处设置字符集的地方,下面分别了解一下这三处设置具体含义:

第一处<%@ page language="java" pageEncoding="gb2312"%>的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件,包括里面的汉字。
第二处编码为解码格式。因为存为gb2312的文件被解码为iso8859-1,这样如有中文肯定出乱码。也就是必须一致。而第二处所在的这一行,可以没有。缺省也是使用iso8859-1的编码格式。所以如果没有这一行的话,也会出现乱码。必须一致才可以。

第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式用不用设置都可以。有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致浏览器混淆了编码格式出现了乱码。

完整解决代码如下:

<%@ page language="java" pageEncoding="gb2312"%>

<%@ page contentType="text/html;charset= gb2312"%>

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html charset=gb2312">

</head>

<body>

<%out.print("JSP的中文处理");%>

</body>

</html>

 

二、 表单提交中文时出现乱码

下面是一个提交页面(submit.jsp),代码如下:

 

<%@ page contentType="text/html; charset=gb2312"%>

<html>

<head><title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<form name="form1" method="post/get" action="process.jsp">

<div align="center">

<input type="text" name="name">

<input type="submit" name="Submit" value="Submit">

</div>

</form>

</body>

</html>

 

 

下面是处理页面(process.jsp)代码:

 

<%@ page contentType="text/html; charset=gb2312"%>

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<%=request.getParameter("name")%>

</body>

</html>

 

如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF- 8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。

Ø POST提交方式

解决办法:

A、 接受参数时进行编码转换

String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;

修改后的process.jsp代码如下:

      

<%@ page contentType="text/html; charset=gb2312"%>

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<%

String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;

out.print(s);

%>

</body>

</html>

 

 

如果使用该方法的话,每一个参数都必须这样进行转码。很麻烦。但确实可以拿到汉字。

B、通过request.seCharacterEncoding ("gb2312")对请求进行统一编码,就实现了中文的正常显示。

修改后的process.jsp代码如下:

 

<%@ page contentType="text/html; charset=gb2312"%>

<%request.seCharacterEncoding("gb2312");%>

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<%=request.getParameter("name")%>

</body>

</html>

 

如果使用该方法接受此参数的页面就不必在转码了,即可得到汉字参数。但每页都需要执行这句话。

C、为了避免每页都要写request.setCharacterEncoding("gb2312"),可以使用过滤器对所有jsp

进行编码处理。就是使用Servlet规范中的过虑器指定编码,主要代码如下:

 

import java.io.*;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {

protected String encoding = null;

public void destroy(){

this.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);

}

}

 

 

过滤器在web.xml中的配置如下:

 

<filter>

<filter-name>SetCharacterEncodingFilter</filter-name>

<filter-class>SetCharacterEncodingFilter</filter-class>

<init-param>

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

<param-value>gb2312</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>SetCharacterEncodingFilter</filter-name>

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

</filter-mapping>

 

 

修改后的process.jsp代码如下:

 

<%@ page contentType="text/html; charset=gb2312"%>

<html>

<head>

<title>JSP的中文处理</title>

</head>

<body>

<%=request.getParameter("name")%>

</body>

</html>


 

以上方法只对POST方式提交有效果。

Ø GET提交方式

如果使用get方式提交中文,接受参数的页面也会出现乱码,这个乱码的原因也是tomcat的内部编码格式iso8859-1导致。Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,导致接受页面得到的参数为乱码。

解决办法:

A、 使用POST提交方式解决办法的第一种方式,对接受到的字符进行解码,再转码。

B 、首先配置tomcat下server.xml的Connector节点增加useBodyEncodingForURI="true"属性配置,然后在JSP页面中加入<%request.seCharacterEncoding("gb2312");%>所设置的编码格式进行编码。

1、Tomcat中server.xml配置如下:

 

<Connector port="8080" protocol="HTTP/1.1" 

connectionTimeout="20000"

redirectPort="8443"

useBodyEncodingForURI="true"

/>

 

  

 

2、修改后的process.jsp代码如下:

 

<%@ page contentType="text/html; charset=gb2312"%>

<%request.seCharacterEncoding("gb2312");%>

<html>

<head>

<title>JSP的中文处理</title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body>

<%=request.getParameter("name")%>

</body>

</html>

 

三、数据库连接出现乱码

这种乱码会使你插入数据库的中文变成乱码,或者读出显示时也是乱码,解决方法如下:  在数据库连接字符串中加入编码字符集 

String Url=" jdbc:sqlserver://localhost:1433; DataBaseName=mydb;user=sa&password=sa&useUnicode=true&characterEncoding=GB2312"; 

 并在JSP页面中使用如下代码: 

 

response.setContentType("text/html;charset=gb2312");  request.setCharacterEncoding("gb2312");

 

 

四、关于jspMyEclipse中打开的乱码问题

对于一个已经存在的项目,Jsp文件的存储格式可能是utf-8。如果新安装的eclipse,则缺省打开使用的编码格式可能iso8859-1。所以导致 jsp里面的汉字出现乱码。这个乱码鱼解决方式如下:

A、Myeclispe Window - > Preferences弹出属性窗口

General - > Workspace 设置Text file encoding 全局设置。

B、右键你的项目---属性---Text file encoding 项目设置

五、关于html页面在eclipse中打开出现乱码情况

由于大部分页面都是由dreamweaver制作,其存储格式跟eclipse的识别有差别导致。

一般这种情况,在eclipse中新建一个jsp,直接从dreamweaver复制页面内容粘贴到jsp即可。

六、JSP页面通过URL传递中文参数的乱码问题

在项目中,我们经常遇到需要在jsp页面切换中传递中文字符。例如:http://website/test1.jsp?act=add&type=苹果

Ø 一般来说我们很少直接在URL里面把参数写成中文,如例子中的"type=苹果"这样传递。如果出现这种情况,在我们的接收参数的页面我们只需要做个简单的转换就可以了。

代码test1.jsp:(主要部分)

   

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String type = request.getParameter("type");
String result = new String(type.getBytes("iso-8859-1"), "gb2312");
out.println(result);
%>

 

Ø 更普遍的做法,就是对url中的中文字符进行编码,变成类似type=%20D%20B这样的字符。

代码MyJsp1.jsp:

 

 

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

<%@ page import="java.net.*" %>
<a href='./MyJsp2.jsp?act=<%=URLEncoder.encode("中国人 非常好")%>'>test</a>

 

代码MyJsp2.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

<%@ page import="java.net.*" %>

<%

String tempVal = URLDecoder.decode(request.getParameter("act"));

out.println(new String(tempVal.getBytes("ISO-8859-1"), "gb2312"));

%>

原文地址

转载于:https://www.cnblogs.com/zuosl/p/4341102.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文本显示变量_几千个IO状态显示.十几分钟搞定实例

工程上常会在一个或者数个界面中对所有IO点监控&#xff0c;很多小伙伴用一一映射的传统方法来实现&#xff0c;在超小型项目中实用性较强&#xff0c;在稍微大一点的项目中实现起来效率低还经常出错。本文旨在分享有价值的实际经验&#xff0c;供小伙伴们参考。在实现监控前要…

贷款购房 房贷 每月还款额是如何计算出来的? 每月还款额计算步骤/方法

http://jingyan.baidu.com/m/article/0eb457e55f23fc03f1a905e5.html购房和贷款是每个普通百姓都关心的事情。贷款购房最基本的问题当然是琢磨贷款、还贷以及还贷年限与自己每月的那点“杯水车薪”收入之间的关系&#xff0c;怎样让它们门当户对起来&#xff0c;如何对着一张载…

wordl流程图怎么写字_DLG的制作流程图

1)影像自适应预处理及几何成像模型参数计算 对原始影像进行增强处理。 根据卫星影像的各种资料构建其几何成像模型。2)像控点及加密点量测 像控点的像方量测。将外业提供的控制点进行量测&#xff0c;点位的量测精度应尽量达到子像素级。 在卫星影像重叠和覆盖范围内量测一定数…

TabBarController创建及使用方法简介

TabBarController创建及使用方法简介 大致讲解一下TabBarController的创建过程&#xff1a; 首先&#xff0c;我们需要一些视图&#xff0c;如创建UIControllerView类型的view1&#xff0c;view2&#xff0c;view3. 然后&#xff0c;我们需要创建 一个UITabBarController类型的…

python操作sqlite3 导入csv文件_[转载]SQLite 3导入导出成txt或csv操作

平时使用官方提供的sqlite3.exe工具来操作 sqlite的数据库,可以在网上下到。进入管理&#xff1a;sqlite3.exe d:\\test.db //假设数据是 d:\\test.db>.databases //显示所有数据库 和 mysql的 showdatabases;>.tables //显示当前数据库的表格 和 mysql 的show tables…

android人脸识别的背景图_Android 图片人脸识别剪切

场景在开发中我们经常需要对图片以人脸为中心进行剪切并显示&#xff0c;这时就需要下面这个工具了。实现效果实现效果项目参考及引用项目使用将下载的jar 和 .so 文件加入到项目中。API 说明在项目中使用如下API即可&#xff1a;CImageView这是一个继承ImageView的图片控件&am…

华为gre隧道全部跑静态路由

最终实现&#xff1a; 1、pc1能用nat上网ping能pc3 2、pc1能通过gre访问pc2 3、全部用静态路由做&#xff0c;没有用ospf&#xff0c;如果要用ospf&#xff0c;那么两边除了路由器上跑ospf&#xff0c;核心交换机也得用ospf r2配置&#xff1a; acl number 3000 rule 5 deny…

数组与串,串的实现,KMP,BF算法

数组是一种常用的数据结构&#xff0c;高级语言头提供了支持数组的基本操作&#xff0c;而且数组也是构成其他数据结构的重要组成。 数组是N个相同元素的构成的占用一块地址连续的内存单元的有限序列。 数组的任一个元素都可以用在数组的位置来表示。 数组与线性表区别&#xf…

libsvm python_LibSVM for Python 使用

经历手写SVM的惨烈教训(还是太年轻)之后&#xff0c;我决定使用工具箱/第三方库PythonLibSVM是开源的SVM实现&#xff0c;支持C&#xff0c; C&#xff0c; Java&#xff0c;Python &#xff0c; R 和 Matlab 等, 这里选择使用Python版本。安装LibSVM将LibSVM仓库的所有内容放入…

结对开发——求最大值

一、题目&#xff1a; 返回一个整数数组中最大子数组的和。 要求&#xff1a; 1.输入一个整形数组&#xff0c;数组里有正数也有负数。 2.数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和。 3.求所有子数组的和的最大值。要求时间复杂度为O(n)。 二…

浏览器获取设备信息_一条命令获取 IE 浏览器保存网站的账号和密码信息

渗透攻击红队一个专注于红队攻击的公众号大家好&#xff0c;这里是 渗透攻击红队 的第 41 篇文章&#xff0c;本公众号会记录一些我学习红队攻击的复现笔记(由浅到深)&#xff0c;不出意外每天一更Powershell内网渗透一直以来都是一个热门话题&#xff0c;试想在一个大型的内网…

__bridge,__bridge_retained,__bridge_transfer

最近遇到类型转换需要添加__bridge等开始不是很理解&#xff0c;后面查询资料才知道在CFObject 与 NSObject 之间转换时&#xff0c;ARC是不能管理Core Foundation object的生命周期。 在CFObject 与 NSObject 之间转换时&#xff0c;需要用到__bridge,__bridge_retained,__bri…

thinkphp5 判断数据是否存在_ThinkPHP 5.1 中间件中判断要访问的操作是否存在

ThinkPHP 5.1 中间件中判断要访问的操作是否存在ifu25 • 2021 年 01 月 15 日按惯例还是吐槽 ThinkPHP 官方社区极度不友好&#xff0c;提问基本得不到答案&#xff0c;更很少有官方人员回复。ThinPHP 5.1 中间件判断 action 是否存在中间件public function handle($request, …

NodeJS 学习记录

一、环境 1. 操作系统&#xff1a;win7, 32位 2. nodejs版本&#xff1a;v0.12.0 3. npm版本&#xff1a;2.5.1 二、问题 1. npm安装镜像源问题 国外镜像源很慢&#xff0c;国内出名且公开的有淘宝&#xff0c;也有内部未公开的&#xff0c;比如我所在的公司 示例&#xff1a; …

(转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性

转发&#xff1a;微软MVP 卢建晖 的文章&#xff0c;希望对大家有帮助。原文&#xff1a;http://blog.csdn.net/kinfey/article/details/44459625 编者语 &#xff1a; 昨晚写好的文章居然csdn不审核&#xff0c;这个也难怪人&#xff0c;但自己比较忙没办法。分享继续&#xf…

mysql sql执行过程_MySQL探秘(二):SQL语句执行过程详解

昔日庖丁解牛&#xff0c;未见全牛&#xff0c;所赖者是其对牛内部骨架结构的了解&#xff0c;对于MySQL亦是如此&#xff0c;只有更加全面地了解SQL语句执行的每个过程&#xff0c;才能更好的进行SQL的设计和优化。 当希望MySQL能够以更高的性能运行查询时&#xff0c;最好的办…

Java——容器(泛型)

【泛型】 起因&#xff1a;JDK1.4之前类型不明确<1>装入集合的类型都被当做Object对待&#xff0c;从而失去自己的实际类型。<2>从集合中取出时往往需要转型&#xff0c;效率低&#xff0c;且很容易出错。解决办法&#xff1a;<1>在定义集合的时候同时定义集…

quartz mysql 初始化_quartz scheduler 从数据库初始化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

mysql group by 慢_mysql“group by”查询非常慢

我在一个有大约100k记录的表中有这个查询,它运行得很慢(3-4s),当我取出组时它更快(少于0.5s).我很想知道如何解决这个问题&#xff1a;SELECT msg.id,msg.thread_id,msg.senderid,msg.recipientid,from_user.username AS from_name,to_user.username AS to_nameFROM msgtable A…

拦截QT关闭窗口的CloseEvent

QDialog类下有一个虚函数 void QDialog::closeEvent ( QCloseEvent * e ) [virtual protected] 通过实现closeEvent函数&#xff0c;就可以以对关闭窗口消息进行拦截&#xff0c;比如程序还没有完成工作时&#xff0c;可以弹出警告窗口&#xff0c;即使用户确认退出操作…