论坛风格切换
您好,欢迎光临本站!   登录 注册新用户
  • 1933阅读
  • 0回复

[JSP相关]spring+jsp+mysql的gbk方案中避免乱码的办法 [复制链接]

上一主题 下一主题
 

发帖
1527
黑豆
-29
威望
6215
贡献值
0
交易币
0
红豆
0
只看楼主 倒序阅读 0 发表于: 2013-05-03

公司的mysql是gbk的,但我为了附庸标准,在做jsp时又用utf-8,但后来又发现cvs上取下来的eclipse工程用的是gbk,很混杂,碰到不少乱码问题,干脆一狠心全GBK呵。
虽然utf-8是最好的,但是我们的xp,我们的notepad,cmd都是gbk的,很多遗留程序是gbk,那还是用gbk吧。
纯UTF-8还是做新项目的时候,从数据库到开发环境到运行环境全套一起用比较好。个人感觉。
总结了一下,有以下几个地方可以设置字符集,那就统一一下全弄成GBK吧。
eclipse工程属性里可以设置。
jsp文件头部
<%@ page language="java" errorPage="/error.jsp" pageEncoding="GBK"
contentType="text/html; charset=GBK"%>
my.ini别改,我个人认为越改越麻烦,mysql就保持它刚刚下载安装的状态就行了。如果你改了,你去别的地方部署的时候可能还得改那台机器上的,如果是外国的主机或者你没权限修改的机器,就更不用说了。
指定每个库和表的字符集比较好,理论上你的sql脚本可以到任意mysql主机上运行并且保证建立后结果都是一样的。不写明的话很多东西依赖上下文的设置,增加了不确定性。
d:\mysql\bin>mysql --default-character-set=gbk -u root -p
用cmd登陆mysql时指定终端的字符集(不指定的话查询时汉字会出现问号,插入可能也有问题)
SET NAMES 'gbk';
//既然下面每个库和表都指定了gbk,这个set names起作用没有?没试验。我懒。
CREATE DATABASE IF NOT EXISTS monitor default charset gbk COLLATE gbk_chinese_ci;
建库的时候指定字符集
CREATE TABLE tablename(
//xxx
)ENGINE=MyISAM DEFAULT CHARSET gbk;
建表也指定一下最好.含含糊糊可不好.
spring中配置过滤器
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.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>*.html</url-pattern>
</filter-mapping>
*.html改成自己需要过滤的url
另外html中form表单最好写action=post,出现乱码的概率就比get方式或者不写明(不写的话IE应该默认是get方式的吧?)要低.url中包含汉字确实不是好主意。还是写明白,不含糊最好。
mysql> show variables like '%char%';
+--------------------------+---------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | latin1 |
| character_set_results | gbk |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | D:\mysql-4.1.22-win32\share\charsets/ |
+--------------------------+---------------------------------------+
7 rows in set (0.00 sec)
最后,在用指定了字符集的cmd登入mysql后各个地方的字符集是这样一个状态
use database_name命令运行后再查,character_set_database=gbk,其他的不变。
这时候已经可以保证不出乱码了。
配置数据源的时候在xml文件中设置url为
jdbc:mysql://localhost:3306/monitor?useUnicode=true&characterEncoding=gbk
据说4.1+的版本加不加这个都无所谓,低版本必须加。懒得试验,既然数据库都指定了gbk这个地方大概不指定也没关系,为了保证出错率更小,就加上吧。
总结:
以前用各种方案或者各种方案的混合体解决乱码问题,比较麻烦,尤其是要修改数据库配置这点最不好。
或者手工new String(xxx.getBytes("ISO-8859-1"),"GBK");这个代码散布在很多地方,更业余.
用filter应该是最好的办法。按道理request和response本来就是应该设置字符集才对。我觉得某些不需要设置的解决方案其实是用其他变通方法把错的数据又转化成能显示的汉字了,个人不提倡使用。
或者有些解决办法用页面插入数据库是好的,显示也是好的,用cmd登进去插入数据和显示就一团糟,或者情况相反,都不好。
经过试验,以上工作做完后,无论页面还是cmd下插入数据和显示(注意cmd登入时要用这个d:\mysql\bin>mysql --default-character-set=gbk -u root -p)都正常,同时改动量和“破坏量”也小,推荐全gbk的项目使用。
快速回复
限100 字节
 
上一个 下一个