首先检查数据从哪里开始乱码 能够用debug来看html
要把数据库的字符集和网页的字符集设置成同样的如utf-8java
另外要选post方法传送mysql
你数据库,页面,数据库链接都是什么编码?
只要这三种都统一就不会乱码!sql
我整理的关于乱码的问题,但愿对你有帮助:
在提交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")的做用是在服务器端设置客户端请求进行从新编码的编码。
该方法用来指定对浏览器发送来的数据进行从新编码(或者称为解码)时,使用的编码。
response.setCharacterEncoding("UTF-8")的做用是指定在客户端对服务器响应进行从新编码的编码。
服务器在将数据发送到浏览器前,对数据进行从新编码时,使用的就是该编码。
-----------------------------------------------------------------------------------------
1、浏览器是怎么样对接收和发送的数据进行编码的
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。
--------------------------------------------------------
2、服务器是在接收和发送数据时,是如何对数据进行编码的
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服务器时,如何防止中文乱码。
一、对于同一个应用,最好统一编码,推荐为UTF-8,固然GBK也能够。
二、正确设置JSP的pageEncoding="UTF-8"
三、在全部的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。
四、对于非表单提交的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"?
1、字符上区分
GBK包含所有中文字符;
UTF-8则包含全世界全部国家须要用到的字符。
2、编码上区分
GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)
UTF-8编码的文字能够在各国各类支持UTF8字符集的浏览器上显示。
例如,若是是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。因此,对于英文比较多的论坛 ,使用GBK则每一个字符占用2个字节,而使用UTF-8英文却只占一个字节。
3、使用上区分
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的字符集困扰,今天就这方面的知识总结一下.
MySQL的字符集支持(Character Set Support)有两个方面:
字符集(Character set)和排序方式(Collation)。
对于字符集的支持细化到四个层次:
服务器(server),数据库(database),数据表(table)和链接(connection)。
1.MySQL默认字符集服务器
MySQL对于字符集的指定能够细化到一个数据库,一张表,一列,应该用什么字符集。app
可是,传统的 程序在建立数据库和数据表时并无使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?函数
(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL 时,能够在配置文件 (my.ini) 中指定一个默认的的字符集,若是没指定,这个值继承自编译时指定的;
(3)启动mysqld 时,能够在命令行参数中指定一个默认的的字符集,若是没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当建立一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
(6)在这个数据库里建立一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,不然此栏缺省的字符集就是表默认的字符集;post
简单的总结一下,若是什么地方都不修改,那么全部的数据库的全部表的全部栏位的都用 latin1 存储,不过咱们若是安装 MySQL,通常都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省状况下,全部的数据库的全部表的全部栏位的都用 UTF-8 存储。
2.查看默认字符集(默认状况下,mysql的字符集是latin1(ISO_8859_1)
一般,查看系统的字符集和排序方式的设定能够经过下面的两条命令:
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | D:"mysql-5.0.37"share"charsets" |
+--------------------------+---------------------------------+
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3.修改默认字符集
(1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,
如 default-character-set = utf8
character_set_server = utf8
修改完后,重启mysql的服务,service mysql restart
使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改为utf8
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:"mysql-5.0.37"share"charsets" |
+--------------------------+---------------------------------+
(2) 还有一种修改字符集的方法,就是使用mysql的命令
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;
通常就算设置了表的默认字符集为utf8而且经过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection链接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES 'utf8';
它至关于下面的三句指令: SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8; 总结: 所以,使用什么数据库版本,不论是3.x,仍是4.0.x仍是4.1.x,其实对咱们来讲不重要,重要的有二: 1) 正确的设定数据库编码.MySQL4.0如下版本的字符集老是默认ISO8859-1,MySQL4.1在安装的时候会让你选择。若是你准备使用UTF- 8,那么在建立数据库的时候就要指定好UTF-8(建立好之后也能够改,4.1以上版本还能够单独指定表的字符集) 2) 正确的设定数据库connection编码.设置好数据库的编码后,在链接数据库时候,应该指定connection的编码,好比使用jdbc链接时,指定链接为utf8方式.