JSP/SERVLET/JAVABEAN 里有四个贴都是讨论中文问题的,可见这个问题太突出了,高手们帮忙去看看那!

snow_jin 2004-11-18 11:03:26
http://community.csdn.net/Expert/topic/3562/3562535.xml?temp=.2578089
...全文
122 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
snow_jin 2004-11-19
  • 打赏
  • 举报
回复
我记得可以不用继承的,好像有一个钩子的,还在寻找中
zcjl 2004-11-19
  • 打赏
  • 举报
回复
struts中所以对Action的访问都得通过ActionServlet
你可以集成这个类,然后override其中的process方法
添加request.setCharacterEncoding("gb2312");
例如:
protected void process(
HttpServletRequest request,
HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {

request.setCharacterEncoding("GB2312");
super.process(request, response);
}
snow_jin 2004-11-19
  • 打赏
  • 举报
回复
呵呵,功夫不负有心人啊!!终于搞明白了,很简单:
1) JSP中只要加入 <%@ page contentType="text/html;charset=GB2312" language="java" %> 就能正确提交中文了!
2)servlet中分别对
1) response.setContentType("text/html; charset=gb2312");
2) request.setCharacterEncoding("gb2312");
就可以正确的输出,和读取中文了!!
那么现在的问题就是如果用了struts,他给我们提供的servlet并没有加入
1) response.setContentType("text/html; charset=gb2312");
2) request.setCharacterEncoding("gb2312");
所以在他调用我们写的actionform的时候就不能正确读取中文了,而我们只能写action,力所不能及。
那么怎么才能修改servlet呢?学习中!
谢谢大家,有好的建议继续哦
snow_jin 2004-11-19
  • 打赏
  • 举报
回复
各位辛苦了!
snow_jin 2004-11-19
  • 打赏
  • 举报
回复
找到了:struts中的处理方法:
扩展org.apache.struts.action.RequestProcessor类,
覆写其中的processPreprocess()方法:

public class MyRequestProcessor extends RequestProcessor {
protected boolean processPreprocess (HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("GB2312");
}catch(Exception e){}
return true;
}
}
修改struts-config.xml:
<controller processorClass=” com.mypro.action.MyProRequestProcessor”/>

好了,这样JSP ,ACTIONFORM,ACTION都搞定了,剩下数据库,在DAO里做插入和读取的时候都要进行转码,其他地方则都不需要转了.
哈哈哈哈,大笑三声!
唉,累啊!
zcjl 2004-11-18
  • 打赏
  • 举报
回复
BBS水木清华站∶精华区
发信人: intranetworm (小虫), 信区: Java
标 题: Unicode 汉字与GB内码的转换
发信站: BBS 水木清华站 (Wed Aug 27 13:44:45 1997)

这是我编的一个转换程序,使用时现将前面的码表存成文件,例如table.txt
创建一个GBUnicode实例,new GBUnicode("table.txt")
以后调用GB2Uni和Uni2GB作内码转换.注意GB内码是用两个字节表示的.

import java.io.*;
import java.util.Hashtable;

class GBUnicode{
byte high[]=new byte[6763],low[]=new byte[6763];
char unichar[]=new char[6763];
Hashtable UniGB;

public GBUnicode(String table_file)throws IOException
{
//BufferedInputStream tables=new BufferedInputStream (new FileInputStream(table_file));
DataInputStream tables=new DataInputStream (new FileInputStream(table_file));
int i,n=0;
byte b,bl,bh,num[]=new byte[20];

UniGB=new Hashtable(7000,1);
while (n<6763 ){
do{
bh=(byte)tables.read();
}while ((char)bh<=' '); //find first non-blank char
bl=(byte)tables.read();
high[n]=bh;
low[n]=bl;
do{
b=(byte)tables.read();
}while (b!=(byte)':'); //find ':'
do{
b=(byte)tables.read();
}while ((char)b<=' '); //find next non-blank char to read as number
i=0;
while ((char)b>='0' && (char)b<='9'){
num[i++]=b;
b=(byte)tables.read();
}
unichar[n]=(char)Integer.parseInt(new String(num,0,0,i));
if (UniGB.get(new Character(unichar[n]))!= null)
System.out.println("Duplicated : "+unichar[n]);
UniGB.put(new Character(unichar[n]),new Integer(n));
n=n+1;
}
tables.close();
}


private int getGBindex(byte high,byte low){
int i,j;
i=high-(byte)0xb0;
j=low-(byte)0xa1;
if (i <39) {// L1 Chinese
if (j<0 || j>94)
return -1;
return (i*94+j);
}
else if (i==39) {//one of the last 89 L1 Chinese
if (j<0 || j>89)
return -1;
return (i*94+j);
}
else {//L2 Chinese
if (j<0 || j>94)
return -1;
return (i*94+j-5);
}
}

public byte[] Uni2GB(char unicode) {

Integer index=(Integer)UniGB.get(new Character(unicode));
if (index==null)
return null;
byte ch[]=new byte[2];
ch[0]=high[index.intValue()];
ch[1]=low[index.intValue()];
return ch;
}

public char GB2Uni(byte high, byte low) {
int index=getGBindex(high,low);
if (index ==-1) //not GB Chinese
return 0;
return(unichar[index]);
}
}

--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: organ.ncic.ac.c]

BBS水木清华站∶精华区
zcjl 2004-11-18
  • 打赏
  • 举报
回复
BBS水木清华站∶精华区
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 13:43:46 2001)


在处理中文的时候经常是new String(str.getBytes("编码方式1"), "编码方式2");
在这里我的理解有3点:
1。java里的字符串都是Unicode来表示的
2。String.getBytes("编码方式")是将用unicode表示的字符串 按照指定的编码方式转换
为一个byte数组
3。new String(byte[], "编码方式"),则是将给定的byte数组按照指定编码方式来解释,
得到一个unicode编码的字符串。

而通常的乱码问题是因为:
传送字符串给java程序时,没有考虑读入的字符串的实际编码类型(GBK),统一按照某一
编码方式(比如8859)来编码,这样我们在程序里就需要先getBytes("8859")还原得到
按照实际编码类型组织的byte数组,然后在new String(byte, "GBK")就可以得到正确的
字符串了.

以上是我对中文问题的理解。
我的说法是否正确的关键是上面我列出的那3点是不是正确的。
问题已经困饶我好久了,请高手指点。
多谢,多谢。

--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]
发信人: FoolsGarden (和水木清华谈恋爱), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 13:59:34 2001)

关于这个问题,我曾经有过研究,你的理解错了,呵呵
【 在 goldstar (淡水河畔的烟火) 的大作中提到: 】
∶ 在处理中文的时候经常是new String(str.getBytes("编码方式1"), "编码方式2");
∶ 在这里我的理解有3点:
∶ 1。java里的字符串都是Unicode来表示的
默认编码
∶ 2。String.getBytes("编码方式")是将用unicode表示的字符串 按照指定的编码方式转换
∶ 为一个byte数组
这个没有错,不过本来就是这样的
∶ 3。new String(byte[], "编码方式"),则是将给定的byte数组按照指定编码方式来解释,
∶ 得到一个unicode编码的字符串。
这个错了,也是你有错误结论的地方
∶ 而通常的乱码问题是因为:
∶ 传送字符串给java程序时,没有考虑读入的字符串的实际编码类型(GBK),统一按照某一
∶ 编码方式(比如8859)来编码,这样我们在程序里就需要先getBytes("8859")还原得到
∶ 按照实际编码类型组织的byte数组,然后在new String(byte, "GBK")就可以得到正确的
∶ ...................

--
秀才戒网了……


※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.77.2]
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 14:02:25 2001)

呵呵,太好了,请指点一下吧。
多谢,多谢
//bow


【 在 FoolsGarden (和水木清华谈恋爱) 的大作中提到: 】
∶ 关于这个问题,我曾经有过研究,你的理解错了,呵呵
∶ 默认编码
∶ 这个没有错,不过本来就是这样的
∶ 这个错了,也是你有错误结论的地方


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 14:04:22 2001)

new String到底是什么意思?
//bow

【 在 FoolsGarden (和水木清华谈恋爱) 的大作中提到: 】
∶ 关于这个问题,我曾经有过研究,你的理解错了,呵呵
∶ 默认编码
∶ 这个没有错,不过本来就是这样的
∶ 这个错了,也是你有错误结论的地方


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]
发信人: FoolsGarden (和水木清华谈恋爱), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 14:05:30 2001)

类的构造,就是一个实例产生了
【 在 goldstar (淡水河畔的烟火) 的大作中提到: 】
∶ new String到底是什么意思?
∶ //bow


--
秀才戒网了……


※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.77.2]
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 14:47:20 2001)

不是,我是问,new String(byte[], "encodeMethod");
中指定的编码方式和byte数组的关系是什么?

【 在 FoolsGarden (和水木清华谈恋爱) 的大作中提到: 】
∶ 类的构造,就是一个实例产生了


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]
发信人: FoolsGarden (和水木清华谈恋爱), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 14:54:02 2001)

byte是什么,就是2进制数的三说
当然计算机中信息都是以二进制存储的,编码方式的指定
只是为构造String类是对byte数组怎么解码后构成String
的,如果编码方式不同,相信Sring也不一样
【 在 goldstar (淡水河畔的烟火) 的大作中提到: 】
∶ 不是,我是问,new String(byte[], "encodeMethod");
∶ 中指定的编码方式和byte数组的关系是什么?


--
秀才戒网了……


※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.77.2]
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 14:58:05 2001)


那我第3点错在哪呢?

呵呵,我悟性不高,还请指点的说 //blush
//bow
【 在 FoolsGarden (和水木清华谈恋爱) 的大作中提到: 】
∶ byte是什么,就是2进制数的三说
∶ 当然计算机中信息都是以二进制存储的,编码方式的指定
∶ 只是为构造String类是对byte数组怎么解码后构成String
∶ 的,如果编码方式不同,相信Sring也不一样


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]
发信人: FoolsGarden (和水木清华谈恋爱), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 15:01:10 2001)

得到unicode有误,自己理解吧,我要走了
【 在 goldstar (淡水河畔的烟火) 的大作中提到: 】
∶ 那我第3点错在哪呢?
∶ 呵呵,我悟性不高,还请指点的说 //blush
∶ //bow


--
秀才戒网了……


※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.77.2]
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 15:04:20 2001)

好吧,多谢指点
//bow

【 在 FoolsGarden (和水木清华谈恋爱) 的大作中提到: 】
∶ 得到unicode有误,自己理解吧,我要走了


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 15:11:35 2001)

我觉得是new String(byte[], "编码方式")中,按照编码方式来解释byte数组
得到一个按指定编码方式编码字符串,又因为java里字符串都是Unicode表示的。
所以,最终是得到了一个Unicode的字符串


【 在 FoolsGarden (和水木清华谈恋爱) 的大作中提到: 】
∶ 得到unicode有误,自己理解吧,我要走了


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]
发信人: goldstar (淡水河畔的烟火), 信区: Java
标 题: Re: 问个java中文的问题
发信站: BBS 水木清华站 (Sat Mar 10 15:20:22 2001)


领悟了,领悟了,的确错了。
感谢FoolsGarden的大力帮助。
//bow
也祝愿本版越来越火
【 在 goldstar (淡水河畔的烟火) 的大作中提到: 】
∶ 我觉得是new String(byte[], "编码方式")中,按照编码方式来解释byte数组
∶ 得到一个按指定编码方式编码字符串,又因为java里字符串都是Unicode表示的。
∶ 所以,最终是得到了一个Unicode的字符串


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.183.50]

BBS水木清华站∶精华区
zcjl 2004-11-18
  • 打赏
  • 举报
回复
转贴一下相关的东东:

BBS水木清华站∶精华区
发信人: gty (红烧鸡翅), 信区: Java
标 题: Java的中文问题
发信站: BBS 水木清华站 (Sun Nov 5 18:59:55 2000)


要理解Java的中文问题,我觉得掌握两点就可以了
1. Java字符串在内存中,只有一种编码---unicode
2. 字符串输入时,将源编码转换为unicode;
字符串输出时,将unicode转换成目标编码

要想这个机制完满运行,Java程序必须知道你输入的东西
是什么编码方式,才能完成输入转换;还必须知道哪种
编码方式符合您的要求,才能完成输出转换。

一个字,难啦。

解决方案:
1、你可以明确地告诉java程序:那个谁谁谁,我想
用这种编码输入,我想用那种编码输出。
设置encoding、设置response的contentType属于
这种方案。
2、Java一般根据系统时区来判断你使用的什么编码,
我们可以把我们的时区调节过来,糊弄Java。
3、有一类比较土的Java程序,只认某一种编码。
没办法,这种情况下,我们只好用getBytes来转换
了。


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.100.7.50]

BBS水木清华站∶精华区
zxhong 2004-11-18
  • 打赏
  • 举报
回复
呵呵,请使用csdn的搜索功能,用起来还是不错的
phoenix123 2004-11-18
  • 打赏
  • 举报
回复
呵呵,的确经常见到这样的帖子
zcjl 2004-11-18
  • 打赏
  • 举报
回复
这个问题有很多具体的因素
但只要保证字符编码的统一(比如用UTF-8、GBK等)
然后把不符合统一编码格式的转码(ISO-8859-1 -> UNICODE)
jerrykey 2004-11-18
  • 打赏
  • 举报
回复
从昨天晚上四点到今天中午,
我就已经回答了5-6遍这个问题了。
我实在是服了……
禽兽v5 2004-11-18
  • 打赏
  • 举报
回复
别人已经问过n遍了,你就不能搜索一下以往解决的帖子?
snow_jin 2004-11-18
  • 打赏
  • 举报
回复
郁闷,今天一天都在为这个问题头痛,可惜,感觉还是 无解 ;\
最终还是要靠转码来解决问题,看来好像是很简单的问题,每个人都可以说上两句:
因为不外乎:
1) <%@ page contentType="text/html;charset=GB2312" language="java" %>
2) <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
3) res.setContentType("text/html;charset=gb2312");
4) 或者转码,或者过滤;
问题总是可以解决的,可是解决的只是表面,细细推敲起来,还是有问题;
也或许是我想的太多了,又没有办法让别人和我一样的思考.
实在也是没有办法了.可是还是心不甘的……

23,404

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧