大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> Java Servlet/Jsp多语言解决方案(一)

Java Servlet/Jsp多语言解决方案(一)

时间: 2021-07-31 作者:daque

java servlet/jsp多谈话处置计划由于从来不信java竟会有不许混排表露多国谈话的bug,这个周末接洽了一下servlet、 jsp的多国谈话表露的题目,也即是servlet的多字符集题目,因为我对字符集的观念还 不是很明显以是写出的货色偶然是精确的,我是如许领会java中的字符集的:在运转时 ,每个字符串东西中保存的都是源代码为unicode内码的(我感触一切的谈话中都是有相映 源代码的,由于在计划机里面字符串老是用内码来表白的,只然而普遍计划机谈话中的字 符串源代码时平台关系的,而java则沿用了平台无干的unicode)。   java从一个byte流中读取一个字符串时,将把平台关系的byte变化为平台无干的un icode字符串。在输入时java将把unicode字符串变化为平台关系的byte流,即使某个un icode字符在某个平台上不生存,将会输入一个'?'。举个例子:在华文windows中,jav a读出一个"gb2312"源代码的文献(不妨是任何流)到外存中结构字符串东西,将会把gb2 312源代码的笔墨变化为unicode源代码的字符串,即使把这个字符串输入又将会把unicode字 符串变化为gb2312的byte流或数组:"华文尝试"----->"\u4e2d\u6587\u6d4b\u8bd5"-- --->"华文尝试"。 如次例程: byte[] bytes = new byte[]{(byte)0xd6, (byte)0xd0, (byte)0xce, (byte)0xc4, (b yte)0xb2, (byte)0xe2, (byte)0xca, (byte)0xd4};//gbk源代码的"华文尝试" java.io.bytearrayinputstream bin = new java.io.bytearrayinputstream(bytes); java.io.bufferedreader reader = new java.io.bufferedreader(new java.io. inpu tstreamreader (bin,"gbk")); string msg = reader.readline(); system.out.println(msg)   这段步调放到包括"华文尝试"这四个字的体例(如华文体例)中,不妨精确地打字与印刷 出那些字。msg字符串中包括了精确的"华文尝试"的unicode源代码:"\u4e2d\u6587\u6d4 b\u8bd5",打字与印刷时变换为操纵体例的默许字符集,能否不妨精确表露依附于操纵体例的 字符集,惟有在扶助相映字符集的体例中,咱们的消息本领精确的输入,要不获得的将 会是废物。   话入正题,咱们来看看servlet/jsp中的多谈话题目。咱们的目的是,任一国度的客 户端经过form向server发送消息,server把消息惠存数据库中,存户端在检索时仍旧能 够看到本人发送的正坚信息。究竟上,咱们要保护,最后server中的sql语句中生存的时 包括存户端发送笔墨的精确unicode源代码;dbc与数据库通信时沿用的源代码办法能包括客 户端发送的笔墨消息,究竟上,最佳让jdbc径直运用unicode/utf8与数据库通信!如许 就不妨保证不会丢食言息;server向存户端发送的消息时也要沿用不丢食言息的源代码方 式,也不妨是unicode/utf8。   即使不指定form的enctype属性,form将把输出的实质按照暂时页面包车型的士源代码字符集u rlencode之后再提交,效劳器端获得是urlencoding的字符串。源代码后获得的urlencodi ng字符串是与页面包车型的士源代码关系的,如gb2312源代码的页面提交"华文尝试",获得的是"%d6 %d0%ce%c4%b2%e2%ca%d4",每个"%"后跟的是16进制的字符串;而在utf8源代码时获得的 却是"%e4%b8%ad%e6%96%87%e6%b5%8b%e8%af%95",由于gb2312源代码中一个中国字是16位的 ,而utf第88中学一个中国字却是24位的。中日韩三国的ie4之上欣赏器均扶助utf8源代码,这种方 案确定包容了这三国谈话,以是咱们即使让html页面运用utf8源代码那么将起码不妨扶助 这三国谈话。   然而,即使咱们html/jsp页面运用utf8源代码,由于运用步调效劳器大概不领会这种 情景,由于即使欣赏器发送的消息不包括charset消息,最多server领会读到accept-la nguage乞求投标,咱们领会仅靠这个投标是不许获知欣赏器所沿用源代码的,以是运用程 序效劳器不许精确领会提交的实质,干什么?由于java中的一切字符串都是unicode16位 源代码的,httpservletrequest.request(string)的功效即是把存户端提交的urlencode编 码的消息转为unicode字符串,有些server只能觉得存户端的源代码和server平台沟通,简 单地运用urldecoder.decode(string)本领径直解码,即使存户端源代码凑巧和server沟通 ,那么就不妨获得精确地字符串,要不,即使提交地字符串中包括了本地字符,那么将 会引导废物消息。   在我提出的这个处置计划里,仍旧指定了沿用utf8源代码,以是,不妨制止这个题目 ,咱们不妨本人定制出decode本领: public static string decode(string s,string encoding) throws exception { stringbuffer sb = new stringbuffer(); for(int i=0; i<s.length(); i++) { char c = s.charat(i); switch (c) { case '+': sb.append(' '); break; case '%': try { sb.append((char)integer.parseint( s.substring(i+1,i+3),16)); } catch (numberformatexception e) { throw new illegalargumentexception(); } i += 2; break; default: sb.append(c); break; } } // undo conversion to external encoding string result = sb.tostring(); byte[] inputbytes = result.getbytes("8859_1"); return new string(inputbytes,encoding); }   这个本领不妨指定encoding,即使把它指定于utf8就满意了咱们的须要。比方用它 领会:"%e4%b8%ad%e6%96%87%e6%b5%8b%e8%af%95"就不妨获得精确的中国字"华文尝试"的 unicode字符串。 此刻的题目即是咱们必需获得存户端提交的urlencode的字符串。对于method为get的fo rm提交的消息,不妨用httpservletrequest.getquerystring()本领读到,而对于post方 法的form提交的消息,只能从servletinputstream中读到,究竟上规范的getparameter 本领被第一次挪用后,form提交的消息就被读掏出来了,而servletinputstream是不许 反复读出的。以是咱们应在第一次运用getparameter本领前读取并领会form提交的消息 。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.