在提交JSP时对于乱码问题,首先我们要搞清楚为什么会出现乱码?

看JSP的头文件:<%@ page contentType="text/html;charset=UTF-8" language="java"%>

在这个头文件中,还有一个与编码的相关的属性:pageEncoding

-----------------------------------------------------------------------------------------

首先,说说JSP/Servlet中的几个编码的作用。     

在JSP/Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和 response.setCharacterEncoding("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet 中。

-----------------------------------------------------------------------------------------

request.setCharacterEncoding("UTF-8")的作用是在服务器端设置客户端请求进行重新编码的编码。

(struts2里面 是在struts.xml 配置<constant name="struts.i18n.encoding" value="UTF-8"></constant>)

该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。     

response.setCharacterEncoding("UTF-8")的作用是指定在客户端对服务器响应进行重新编码的编码。     

      服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。

-----------------------------------------------------------------------------------------

一、浏览器是怎么样对接收和发送的数据进行编码的 

1.浏览器接受数据:

    response.setCharacterEncoding("UTF- 8")的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在 JSP中设置response.setCharacterEncoding("UTF-8")或者 response.setCharacterEncoding("GBK"),浏览器均能正确显示中文。

    读者可以做个实验,在JSP中设置response.setCharacterEncoding("UTF-8"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是" Unicode(UTF-8)",而在在JSP中设置response.setCharacterEncoding("GBK"),在IE中显示该页面 时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。

2.浏览器发送数据:

     浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使response.setCharacterEncoding参数来进行URL编码的。以百度和 GOOGLE为例,如果你在百度中搜索"汉字",百度会将其编码为"%BA%BA%D7%D6"。而在GOOGLE中搜索"汉字",GOOGLE会将其编 码为"%E6%B1%89%E5%AD%97",这是因为百度的response.setCharacterEncoding参数为GBK,而 GOOGLE的的response.setCharacterEncoding参数为UTF-8。 

--------------------------------------------------------

二、服务器是在接收和发送数据时,是如何对数据进行编码的

1.服务器发送数据

     对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。   

2.服务器接收数据

     对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。     

     因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。   

     ①对于表单中POST方式提交的数据

     只要在JSP页面上设置了response.setCharacterEncoding或contentType或pageEncoding为"utf-8",在接受数据的JSP/SERVLET中都不会出现中文乱码问题。

     ②对于URL提交的数据和表单中GET方式提交的数据

     在接收数据的JSP/SERVLET中仅仅设置request.setCharacterEncoding参数是不行的

     因为在Tomcat5.0中,默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),要解决该问题:     

     应该在Tomcat的配置文件server.xml的Connector标签中设置useBodyEncodingForURI或者 URIEncoding属性,其中URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。

     其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding 参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false;

     URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码(解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。    

 ----------------------------------------------------------   

下面总结下,以Tomcat5.0为WEB服务器时,如何防止中文乱码。     

1、对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。     

2、正确设置JSP的pageEncoding="UTF-8" 

3、在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。     

4、对于非表单提交的get或url请求,可以修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为 UTF-8(有可能影响其他应用,所以不推荐)。或者用下面的方法,在接收数据时处理:

  request.getParameter("userID"),得到userID的值   

  request.getParameter("userID").trim()将这个值去掉两边的空格   

  request.getParameter("userID").trim().getBytes("ISO-8859-1"))将这个String用ISO-8859-1编码成一个字节数祖   

  new   String(request.getParameter("userID").trim().getBytes("ISO-8859-1"),"utf-8")将刚才的字节数祖传进string的构造函数按照"utf-8"编码创建一个string对象。 

5.使用URLEncoder的方法

传参前用: 

//使用指定的编码机制将字符串转换为 application/x-www-form-urlencoded 格式

String username_encoder = URLEncoder.encode(username,"UTF-8");

接参数后显示用:

//使用指定的编码机制对 application/x-www-form-urlencoded 字符串解码

String username_decoder = URLDecoder.decode(request.getParameter("username"),"UTF-8");

-----------------------------------------------------------------------------------------

什么是"gbk"?什么是"utf-8"?

一、字符上区分 

  GBK包含全部中文字符; 

  UTF-8则包含全世界所有国家需要用到的字符。

二、编码上区分 

  GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准) 

  UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。 

  例如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

三、使用上区分 

  GBK是中国国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大,而且是一般做论坛的DZ这些程序,对应的组件和插件支持上GBK相应开发的比较全面点,再DIY的时候比较方便。 

  UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛,而且中文可以直接识别,如果你的论坛要做的比较国际化那就必须用UTF8的。



  补充下:UTF8再繁体支持上比GBK有优势滴。 

  对于DZ论坛来说,很多插件都只支持GBK的,如果需要装较多插件的论坛还是用GBK比较好,而对装较少插件且有特殊用户群的论坛用UTF8比较好。 

  所以,一般你要是做论坛只是国内的特定圈子里的就用GBK简单点,基本插件都可以安装,但是如果你的站有国外的市场需要就建议UTF8了,



Web中文网站开发中,GBK与UTF-8是使用比较多的两种字符集,但二者是有区别的。总结如下。

1. GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。

   UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8节省空间。

2. GBK包含全部中文字符,包括简体和繁体字

   UTF-8则包含全世界所有国家需要用到的字符。

3. GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)

   UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。

   比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。



请注意:

   UTF-8版本虽然具有良好的国际兼容性,但中文需要比GBK/BIG5版本多占用50%的数据库存储空间,因此并非推荐使用,仅供对国际兼容性有特殊要求的用户使用。

简单地说:

   对于中文较多的论坛,适宜用GBK编码节省数据库空间。

对于英文较多的论坛,适宜用UTF-8节省数据库空间。

当然 还要记得看服务器mysql字符编码是怎样的 毕竟如果很多人用的话 当然还要考虑别人 服务器mysql是utf8所以我们都设置为UTF-8 省事



所以. jsp每次开头加这段话

<%@ page language="java" contentType="text/html;charset=utf8"  isELIgnored="true" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>"/>

版权声明:本文为博主原创文章,未经博主允许不得转载。

乱码之UTF-8 &GBK的更多相关文章

  1. is 和 == 的区别,utf和gbk的转换,join用法

    is 和 == 的区别 # is 比较的是内存地址 # == 比较的是值 a = 'alex' b = 'alex' #int,str(小数据池)会被缓存,为了节约内存 print(id(a),id( ...

  2. 【已解决】python中文字符乱码(GB2312,GBK,GB18030相关的问题)

      http://againinput4.blog.163.com/blog/static/1727994912011111011432810/ [已解决]python中文字符乱码(GB2312,GB ...

  3. Linux字符编码默认为UTF-8,如出现乱码可设置为GBK

    Linux字符编码默认为UTF-8,如出现乱码可设置为GBK1.手动更改profile文件的命令: vi /etc/profile 也可以修改 /etc/sysconfig/i18n 文件,如 LAN ...

  4. python中文字符乱码(GB2312,GBK,GB18030相关的问题)

    转自博主 crifan http://againinput4.blog.163.com/blog/static/1727994912011111011432810/ 在玩wordpress的一个博客搬 ...

  5. 字符集乱码问题:ISO-8859-1和GBK

    问题,引用百度知道的问题吧: http://zhidao.baidu.com/question/51342167.html?qbl=relate_question_0&word=%C3%84% ...

  6. Eclipse 乱码解决方案(UTF8 -- GBK)

    UTF8 --> GBK;   GBK --> UTF8 eclipse的中文乱码问题,一般不外乎是由操作系统平台编码的不一致导致,如Linux中默认的中文字体编码问UTF8, 而Wind ...

  7. phpstorm改变文件编码由utf变为gbk

    PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. 由于PHPStorm编辑器默认是UTF-8编码 如果开发的是 ...

  8. cmd运行乱码或显示编码GBK的不可映射字符解决方法

    出现这样的错误,一般是因为代码中含有中文字符,注释中的中文字符也算.由于使用cmd运行java程序的时候,系统默认的编码格式是gbk.而包含中文字符的代码一般是Unicode格式,所以直接运行含有中文 ...

  9. java中文GBK和UTF-8编码转换乱码的分析

    原文:http://blog.csdn.net/54powerman/article/details/77575656 作者:54powerman 一直以为,java中任意unicode字符串,可以使 ...

  10. 关于解决乱码问题的一点探索之二(涉及Unicode(utf-16)和GBK)

        在上篇日志中(链接),我们讨论了utf-8编码和GBK编码之间转化的乱码问题,这一篇我们讨论Unicode(utf-16编码方式)与GBK编码之间转换的乱码问题.     在Windows系统 ...

随机推荐

  1. Mac端 Open GL初探

    一.环境配置 1.创建macOS工程 2.添加OpenGL.framework和GLUT.framework两个系统库 3.拖入资源文件 如果libGLTools.a问价先拖入到工程其他位置,后再移到 ...

  2. VUE 生命周期 详解

    beforeCreate vue中的第一个生命周期,在vue实列被完全创建出来之前会执行.注意:在beforeCreate生命周期函数执行时,data.methods.中的数据都还没有初始化. cra ...

  3. redis缓存穿透和缓存失效的预防和解决

    缓存穿透: 认识 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透. 解决办法: 对所 ...

  4. 用Modelsim SE 直接仿真 Altera(Intel PSG) IP核 需要注意的问题

    如果我们直接用Modelsim SE仿真 Altera IP核,首先会进入Quartus II目录下找到IP核对应的仿真库源文件,然后在Modelsim SE中进行编译,添加到Modelsim SE的 ...

  5. 20155306 白皎 《网络攻防》Exp1 PC平台逆向破解——逆向与Bof基础

    20155306 白皎 <网络攻防>Exp1 PC平台逆向破解--逆向与Bof基础 实践相关说明 1.1 实践目标 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. ...

  6. PostgreSQL统计信息索引页

    磨砺技术珠矶,践行数据之道,追求卓越价值 返回顶级页:PostgreSQL索引页 本页记录所有本人所写的PostgreSQL的统计信息相关文摘和文章的链接: pg_stats:   --------- ...

  7. c++ 条件判断

    if语句 认识算术比较 运算符表达式用法 关系运算符表达式 一. 基本的if语句 if (条件成立) { 则执行此语句 }; // ) printf("条件成立"); 二.认识算术 ...

  8. 【转载】COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

    原文:http://vckbase.com/index.php/wv/1236.html 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳 ...

  9. UWP 轨道视图Orbit View

    先看一下效果吧 这是我的Music Tags App里面的效果图,当然你也可以做的比我的更炫. 其实这个效果的实现来自于控件UWP Community Toolkit的OrbitView,所以大家要多 ...

  10. python 实现redis订阅发布功能

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...