J2EE初步,第一次接触的那些乱码问题
本学期初次接触《J2EE技术》这门课程,虽然自己的方向并不是Java Web方向,但是没办法,还是要花费很多的时间去探索。当然,首先遇到的就是各种恶心的乱码问题,字母系语言的程序员应该不会遭遇这些迷惑吧! 最开始的是jsp文件是UTF-8编码的,然而确使用jsp默认编码iso8859-1,在浏览器中打开乱码!于是,按照以前的经验在jsp文件中加入”<meta charset=utf-8 />”结果一点用也没有。原来,页面编码的决定权在“pageEncoding="UTF-8"”手上,那个”<meta charset=utf-8 />”写与没写都是一样的。
解决初步问题之后,再次遭遇的乱码问题是通过jsp表单向Servlet提交数据;起初全是使用英文测试没在意,结果使用中文之后,居然又再次出现恶心的乱码。然后,在Servlet修改至下面的两段代码:
response.setContentType("text/html;charset=UTF-8");request.setCharacterEncoding("UTF-8");
自以为问题解决之后,赶紧测试一下,结果居然没有一点儿的变化。谷歌、必应、百度之,原来要改服务器配置文件。以我的修改为例:进入服务器安装目录:apache-tomcat-7.0.37/conf管理员权限编辑server.xml文件,修改内容如下:
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />
即使是修改过了,可是还是没有见到自己想见的中文,看到的又是乱码字符。后来,貌似又可以了;然后又不在意间又出现乱码。这让我纠结了好长的一段时间。后来,才意识到自己没有重启服务器,改过的配置文件没有马上生效;还有就是我居然将response.setContentType("text/html;charset=UTF-8");request.setCharacterEncoding("UTF-8");这两行代码写到request.get...()之后,没有发挥request.setCharacterEncoding("UTF-8");的作用。
至此,在j2ee方面的乱码问题算是解决啦!下面遭遇的是mysql数据库链接乱码悲剧。
学习《数据库系统概论》时老师选用的数据库是Oralce。这个大家伙,貌似那段时间数据库基础知识倒霉有学扎实,倒是如何安装Oracle和PL/SQL软件花费了一个学期。到Oracle好不容易安装好了,数据库课程也结束了。myql之前也接触过,但是没有这次这么细致。
说明下,我做的小网站页面使用的默认编码是UTF-8。首先,我在Mysql数据库下建立数据库和表,在Mysql终端插入数据,然后select * from居然出现乱码,没在意;然后用JDBC访问读取数据库内容。丫的,居然还是乱码。然后再调用Java相关方面的类进行转码。嗯,显示中文了!可是,这样就不自在了,明明可以直接在数据库中读取内容,然后进行增、删、改、查的操作即可,为啥非要进行转码操作呢?这不是浪费资源么?要是有数百万的数据,光转码操作都要浪费多少资源呀!查找了许多的资料,然后更改Mysql数据库配置,改配置文件,设置各种默认编码为UTF-8,后来,一切正常。
后来,一切貌似可以说是正常啦!可是,我又忽视了一点,我所有的测试都是在本机进行的。当我把我做的上传到远程服务器时,又出现和上述一样的数据库乱码。但是,当我欲修改数据库配置文件时,才发现自己的权限不够。难道,为了自己的网站去让管理员更改数据库配置?那会不会影响别人的数据库使用呢?最后,自己才意识到数据库编码在数据库创建的时候就要开始注意了。
根据查询的网上资料,要使用UTF-8编码,数据库应该类似于以下的创建方式:
create database tianhuifang default character set utf8 collate utf8_general_ci;
create table iuser(id int primary key auto_increment,name varchar(50) not null,password varchar(50) not null, email varchar(50) unique not null) default charset utf8;
这时,我才意识到自己具备一般程序员不应该具备的坏习惯:遇到困惑,只想着去改变别人的东西,或是埋怨别人的缺陷;却不愿从自己的源码开始,尝试去适应。
这样创建的数据库,根本不用去考虑mysql默认的编码问题。当然,到此也不是最后就不再出现乱码了。在使用JDBC链接mysql时,别忘了?characterEncoding=UTF-8这段内容,也就是如下的形式:
DriverManager.getConnection("jdbc:mysql://localhost:3306/ijavame?characterEncoding=UTF-8","root","***");
终于,到最后遇到的困难几乎都和乱码无关了!最后,告诫自己:程序员,不要埋怨;有时候,埋怨就是你技术不行,实力不够。