最近在用netbeans研究Webwork开发,在被折腾死去活来,差点被气得把电脑从窗口扔出去后,终于用utf-8统一编码,搞定了中文乱码问题。
先声明一下自己使用的环境:WindowsXP + netbeans5.5.1中文版 + Webwork插件 + java1.6 + mysql5.0。使用netbeans内置Tomcat。
中文乱码的问题主要表现在
- jsp中使用webwork的tag,Label中使用中文无法通过编译。提示“编码GBK的不可映射字符”。
- 将中文写入mysql数据库中时,全部变成“??”
页面之间传参没有乱码。Action的结果页面可以正常接收并显示。
经过一番查找,找到了问题所在:
- netbeans模板生成的jsp默认为utf-8编码
- java源文件编码与本地系统一致,在Windows下应该是GB2312。
- mysql的JDBC驱动默认使用ISO8859_1
- mysql新建数据库字符型数据默认编码为Latin1
其中最后两项基本是兼容的,其他的之间就会兼容性问题了。乱码及变“?”就是在这些不同编码之间传递或组合之中出现的。
解决的原则很简单:统一编码。
我现在使用的是统一为utf-8,优点是确保在不同系统上的兼容性(目前几乎所有系统都能良好支持utf-8),缺点是中文一个字在utf-8编码中会占用3个字节,比gbk多占用一半的空间。
1)jsp文件无需改变。只需确认jsp头部有
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%>
html头部有以下声明:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
2)Java源文件
在netbeans中打开“工具”-“选项”,在打开的选项卡中点击左下角的“高级选项”,在左侧的树中找到“编辑”-“Java源代码”,在“缺省编码”中输入“utf-8”
3)数据库连接
连接数据库时的url中加入编码选择:
jdbc:mysql://localhost/regtest?user=root&password=root&useUnicode=true&characterEncoding=UTF8
4)数据库编码
在mysql中建库时将数据库的编码设为“utf8_general_ci”。
OK,在我的系统上完成这些后乱码再也没出现过。有空的话再研究一下gbk编码下的解决。