不知道是哪里出的问题

07-08-08 raulliran
mysql 的 Encoding 是gb2312
页面的设置也是<%@ page contentType="text/html; charset=gb2312" %>
按理说表单传过来的中文,经过String test=new String(request.getParameter("aa").getBytes("ISO8859_1"));
转换,就应该没问题了啊,但是还是显示"???",真不知道该怎么办了?到底是哪里除了问题呢??
我用的是tomcat5.5

winit
2007-08-11 17:38
修改mysql的配置文件(windows下为my.ini),将其中的两个default-character-set都设置成为UTF8。
在创建数据库时说明其编码格式,例如:create database test character set utf8; 或者将某个表或字段设置成为utf8(具体方式见mysql文档),同时在使用mysql的jdbc驱动连接数据库的时候,使用的url后面添加:?useUnicode=true&characterEncoding=UTF8。
注意:如果只是中文的话字符集也可以设置成为gbk或gb2312
试一试看行不?

goldlive
2007-08-14 11:07
在tomcat\conf\server.xml中,给节点connector加一个属性URIEncoding="GBK"
<Connector
port="8090" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="GBK"/>
也可以使用过滤器

goldlive
2007-08-14 11:13
我记得好像这样用
String test = new String(request.getParameter("aa").getBytes("ISO-8859-1"),"GB2312");

raulliran
2007-08-15 10:20
banq说得没错,jsp中文乱码是java程序员的噩梦

我现在页面有:
<%@ page contentType="text/html; charset=gb2312"%>
<%@ page pageEncoding="gb2312"%>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<%request.setCharacterEncoding("gb2312");%>

在tomcat\conf\server.xml里
<Connector
port="8090" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="GBK"/>

我觉得现在已经不是在页面写什么语句的问题了,因为我已经在网上找了很久了,该试的我几乎都试过了。我觉得应该是我的配置文件的问题比如:修改*.xml里的代码,上面那个我试了试,还是不行
另外值得提一句:根据我的分析应该是和我第一次用netbeans有关系,它新建页面后自动生成的代码,都是把页面设置成UTF-8的编码,是我手动修改成上面的代码的,是不是netbeans也自动修改某个配置文件呢?

我有一个问题:我想把字符都统一成gb2312。页面上都是gb2312,xml里是写GBK没关系吧?还是无论在什么地方都必须写成gb2312。
(我知道GBK是gb2312的扩充,但是不知道这样写行不行)
还有一个问题:在我的webapps\ROOT里,只要是我的WEB-INF文件夹下都有一个web.xml,我打开一看有<?xml version="1.0" encoding="UTF-8"?>
于是我久把我的工程文件根目录里的WEB-INF下的web.xml,改成<?xml version="1.0" encoding="gb2312"?>,这样改对吗?
这个语句是说的什么编码

我的理解的编码原理(从客户端到TOMCAT再到数据库)是:
首先将jsp文件中的中文处理统一成gb2312格式,WEB容器就把JSP文件从gb2312格式转化为UNICODE格式,编译成Servlet类。
当客户端请求它时,WEB容器调用JVM来运行Servlet,JVM先以UNICODE编码将Servlet写入内存,当需要接受从客户端传来的中文字符时,由于编写了request.setCharacterEncoding("gb2312"),WEB容器会默认采用gb2312来接受传入的值并在JVM中转化为UNICODE格式的保存在WEB容器的内存中
(将从客户端输入的中文字符写入数据库)JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1的格式,然后传递到数据库,由于mysql设定的字符集是bg2312的,所以数据库将ISO-8859-1格式自动转成gb2312格式
也就是说gb2312(客户端)->UNICODE(内存)->ISO-8859-1(JDBC)->gb2312(数据库)

以上就是我认为的编码格式的转换原理,我估计应该有不对的地方,否则中文问题早就解决了,希望各位大虾指点,帮我脱离jsp中文乱码的苦海!我真的受不了了!
我写的有些乱,问题很杂,回答时请注明回答的是哪个问题,谢谢



[该贴被raulliran于2007年08月15日 10:24修改过]

banq
2007-08-15 12:32
你想统一成GB2312,那么在Linux等非中文操作系统就有问题。

需要将数据库编码或者连接字符串类型设置为GB2312

需要使用ServletFilter将所有各种类型的浏览器客户端提交的Http包进行转换成GB2312。

不要使用getBytes这样非常原始的类型转换。

可下载一个源码查看别人的中文解决方式(如Jdon框架应用包),涉及很多环节。

qqianwu
2007-08-15 13:00
前段时间我也碰到了这个问题,不是传进去是乱码就是传出来是乱码。后来我是这样解决的,希望对你有帮助。
首先把项目的文本文件编码设成utf-8,写一过滤器,网上有的搜,有现成的。在web.xml里设好。在有传入的页头加上:
<%@ page contentType="text/html;charset=utf-8" language="java"%>
<%request.setCharacterEncoding("gb2312");%>
貌似就可以了。我原先偿试全改成gb2312,可页面显示是乱码。你试试吧,不行再提出来!

raulliran
2007-08-15 20:22
最后我按照二楼说的,(只是把字符集修改成gb2312)成功地解决了困扰自己很长时间地中文问题
真地很感谢大家

我是个初学者,所以下面的问题是写个初学者们思考的
=====================================

我想把自己在解决中文问题的过程中,所遇到的问题拿出来和大家讨论
问题1:为什么中文的字符集有GBK,gb2312和big5 三种 ?
从技术上有没有可能将这三种字符集统一成一种,或者说是将GBK和BIG5统一成一种字符集
如果双字节不够的话有没有可能来一个三字节的中文编码,然后再和国际的统一,然后全世界都统一用三字节的编码制度(自己瞎想的,嘿嘿)
问题2:useUnicode=true&characterEncoding=gb2312这句话的实质改变了什么?
如果是改变了JDBC连接数据库往里写数据时的转换字符的方式,那么像这样的工作不是应该由DBMS来完成吗?
=====================================
我是一个在校大学生,所以当banq说国内大学不注重OO思想的培养的时候,我很是赞同,我们学校的老师都是以前从事软件开发很多年的老老师,面向过程的思想在他们脑中根深蒂固
而且我们学校特别重视PB的学科,关于PB的课程都已经开三门了(都是用PB,只不过做的东西越来越深)
我想知道,在B/S发展迅猛的今天是否需要C/S模式?
如果真的有一天webOS时代来临,是否是C/S时代的彻底终结??

我现在面临很多条路,需要选择一条相对正确的道路,就目前而言,我选择java流。原因有很大一部分是看到了JDON,从而在java方面产生很多思考,同时业产生了很大的兴趣,我觉得和别的同学相比我很幸运
那么在确立了自己java的成长道路之后,又该问问自己,在java流里面我又该选择那条分流?
希望banq能够给初学者们简单的列举一下,java的开发道路上都有哪几种分支?哪些人适合做哪些分支,各个分支的特点等等,让我们对java领域有一个大致的了解,从而更好地确立自己的努力方向

最后再次谢谢大家的帮助

猜你喜欢