仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1323|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页编程之JSP中文乱码成绩的办理

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:34:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你希望java的IDE整合。这个是没有必要的,重要的是你理解java有多深以及怎么组织你的代码,即使没有IDE,代码照样能够编译运行的。js|办理|成绩|中文|中文乱码字符内码
每一个国度(或地区)都划定了盘算机信息互换用的字符编码集,如美国的扩大ASCII码、中国的GB2312-80、日本的JIS等,作为该国度(地区)信息处置的基本,有着一致编码的主要感化。因为各当地字符集代码局限堆叠,互相间信息互换坚苦,软件当地化版本自力保护本钱较高。因而有需要将当地化事情中的个性抽掏出来,做分歧性处置,将特别的当地化处置内容下降到起码,这就是所谓的国际化(I18N)。各类言语信息被标准为当地信息,而底层字符集接纳包括了一切字符的Unicode。
字符内码(charactercode)指的是用来代表字符的内码。我们在输出和存储文档时都要利用内码,内码分为单字节内码和双字节内码。单字节内码的英文全称是Single-ByteCharacterSets(SBCS),能够撑持256个字符编码;双字节内码的英文全称是Double-ByteCharacterSets(DBCS),能够撑持65000个字符编码,次要用来对年夜字符集的东方笔墨举行编码。
CodePage指的是一个经由选择的以特定按次分列的字符内码列表,关于初期的单字节内码的语种,CodePage中的内码按次使得体系能够依照此列表来依据键盘的输出值给出一个对应的内码。关于双字节内码,给出的是MultiByte到Unicode的对应表,如许就能够把以Unicode情势寄存的字符转化为响应的字符内码。引进对CodePage的撑持次要是为了会见多语种文件名,今朝在NTFS和FAT32/VFAT下的文件体系上都利用Unicode,这必要体系在读取这些文件名时静态地将其转换为响应的言语编码。
信任懂得JSP代码的读者对ISO8859-1必定不生疏,ISO8859-1是我们平常利用对照多的一个CodePage,它属于西欧语系。GB2312-80是在国际盘算机汉字信息手艺开展初始阶段制定的,个中包括了年夜部分经常使用的1、二级汉字和9区的标记。该字符集是几近一切的中文体系和国际化的软件都撑持的中笔墨符集,这也是最基础的中笔墨符集。
GBK是GB2312-80的扩大,是向上兼容的。它包括了20902个汉字,其编码局限是0x8140~0xFEFE,剔除高位0x80的字位,其一切字符都能够一对一映照到Unicode2.0,也就是说Java实践上供应了对GBK字符集的撑持。
>GB18030-2000(GBK2K)在GBK的基本长进一步扩大了汉字,增添了躲、蒙等多数平易近族的笔墨。GBK2K从基本上办理了字位不敷、字形不敷的成绩。

分歧开辟平台的区分
1.Tomcat4开辟平台
Windows98/2000下的Tomcat4以上版本城市呈现中文成绩(而在Linux下和Tomcat3.x中则没有成绩),次要体现是页面显现乱码。在IE中调剂字符集为GB2312,就能够一般显现了。
为办理这个成绩,可在每一个JSP的页面入手下手处加上<%@pagelanguage=“Java”contentType=“text/html;charset=gb2312”%>。不外,这还不敷,固然这时候显现了中文,可是发明从数据库读出的字段酿成了乱码。经由剖析发明:在数据库中保留的中笔墨符是一般的,数据库用ISO8859-1字符集存取数据,而Java程序在处置字符时默许接纳一致的ISO8859-1字符集(这也表现了Java国际化头脑),以是在数据增加的时分Java和数据库都是以ISO8859-1体例处置,如许不会堕落。可是在读取数据的时分就呈现成绩了,由于数据读出也接纳ISO8859-1字符集,而JSP的文件头中有语句<%@pagelanguage=“Java”contentType=“text/html;charset=gb2312”%>,这申明页面接纳GB2312的字符集显现,如许就和读出的数据纷歧样。这时候页面显现从数据库中读出的字符是乱码,办理的办法是对这些字符转码,从ISO8859-1转成GB2312,就能够一般显现了。这个办理举措对良多平台具有通用性,读者能够天真使用。
2.Tomcat3.x、Resin及Linux平台
在Tomcat3.x、Resin中或是在Linux下,没有到场语句<%@pagelanguage=“Java”contentType=“text/html;charset=gb2312”%>,而页面中的<metahttp-equiv=“Content-Type”content=“text/html;charset=gb2312”>语句起了感化,此时能够一般显现。相反,假如加上<%@pagelanguage=“java”contentType=“text/html;charset=gb2312”%>体系会报错,申明Tomcat4以上版本的引擎在处置JSP时仍是有不同的。
别的,关于分歧的数据库如SQLServer,Oracle,Mysql,Sybase等,字符集的选择很主要。假如思索多言语版本,数据库的字符集就应当一致接纳ISO8859-1,必要输入的时分在分歧的字符集之间做转换就能够了。
以下是针对分歧平台的总结:
(1)JSWDK只合适于一般开辟,不乱性和其他成绩大概不如贸易软件。因为JDK1.3版功能要好过JDK1.2.2良多,而且对中文的撑持也较好,以是应当只管接纳。
(2)作为收费的贸易软件,Resin不但速率快、不乱、主动编译,还能够指出堕落行,并可在服务器端撑持利用JavaScript等,并且对中文的撑持也很好。
(3)Tomcat仅仅是一个对JSP1.1、Servlet2.2尺度的完成,我们不该该请求这个收费软件在细节和功能上都八面玲珑,它次要思索英文用户,这也是为何不做特别转换,汉字用URL办法传送就有成绩的缘故原由。年夜部分IE扫瞄器缺省一直以UTF-8发送,这仿佛是Tomcat的一个不敷,别的Tomcat不论以后的操纵体系是甚么言语,都按ISO8859往编译JSP,仿佛也不当。

JSP代码的中文处置
在JSP代码中以下几处常常必要触及到中文处置:
1.在URL中附带中文参数。这里中文参数一般能够间接读取,比方:<%=request.getParameter(“showword”)%>
2.在JSWDK中读取HTML表单提交的中文值这时候必要加以编码,较为简便的写法是:
Stringname1=newString(request.getParameter(“user_id”).getBytes(“ISO8859_1”))。
别的,在JDK1.3的撑持下,不需到场<%@pagecontentType=“text/html;charset=gb2312”%>,而在JDK1.2.2以下,即便以上两种办法同时使用也很不不乱。但在Resin平台,情形较好,只需在页面第一行到场:<%@pagecontentType=“text/html;charset=gb2312”%>便可准确处置中文,假如再加代码则反而不合错误。
3.在JSWDK中Session包括的中文,假如从表单中读出的值经由编码可准确显现,但间接付与中文值则不可,而Resin平台则很好。
4.在编译Servlet和JSP时到场代码选项。在编译Servlet时利用Java-EncodingISO8859-1myservlet.java;在JSP的ZONE设置文件中,修正编译参数为:Compiler=builtin-javac-encodingISO8859-1。利用这类办法后,不必要做其他的修改就能够一般显现中文了。
别的,盛行的干系数据库体系都撑持数据库Encoding,也就是说在创立数据库时能够指定它本人的字符集设置,数据库的数据以指定的编码情势存储。当使用程序会见数据时,在出口和出口处城市有Encoding转换。关于中文数据,数据库字符编码的设置应该包管数据的完全性。GB2312、GBK、UTF-8等都是可选的数据库Encoding,也能够选择ISO8859-1(8-bit),但会增添了编程的庞大度,ISO8859-1不是保举的数据库Encoding。在JSP/Servlet编程时,能够先用数据库办理体系供应的办理功效反省个中的中文数据是不是准确。

处置办法实例
上面是两个详细的中文乱码办理实例,读者细心研讨后大概会有所劳绩。
1.罕见的字符转换办法
将Form中的值传送到数据库中再取出来后全变成了“?”。Form用POST提交数据,代码中利用了语句:Stringst=new(request.getParameter(“name”).getBytes(“ISO8859_1”)),并且也声了然charset=gb2312。
要处置Form中传送的中文参数,应当在JSP中到场上面的代码,别的界说一个专门办理这个成绩的getStr类,然后对吸收到的参数举行转换:
Stringkeyword1=request.getParameter(“keyword1”);
keyword1=getStr(keyword1);
如许就能够办理成绩了,代码以下:
<%@pagecontentType=“text/html;charset=gb2312”%>
<%!
publicStringgetStr(Stringstr){
try{Stringtemp_p=str;
byte[]temp_t=temp_p.getBytes(“ISO8859-1”);
Stringtemp=newString(temp_t);
returntemp;
}
catch(Exceptione){}
return“NULL”;
}
%>
<%--http://www.cndes.com测试--%>
<%Stringkeyword=“创联收集手艺中央接待您的到来”;
Stringkeyword1=request.getParameter(“keyword1”);
keyword1=getStr(keyword1);
out.print(keyword);
out.print(keyword1);
%>
2.JDBCDriver的字符转换
今朝年夜多半JDBCDriver接纳当地编码格局来传输中笔墨符,比方中笔墨符“0x4175”会被转成“0x41”和“0x75”举行传输。因而必要对JDBCDriver前往的字符和要发给JDBCDriver的字符举行转换。当用JDBCDriver向数据库中拔出数据时,必要先将Unicode转成Nativecode;当JDBCDriver从数据库中查询数据时,则必要将Nativecode转换成Unicode。上面给出了这两种转换的完成:
Stringnative2Unicode(Strings){
if(s==null||s.length()==0){
returnnull;
}
byte[]buffer=newbyte[s.length()];
for(inti=0;is.length();i++){if(s.charAt(i)>=0x100){
c=s.charAt(i);
byte[]buf=(“”+c).getBytes();
buffer[j++]=(char)buf[0];
buffer[j++]=(char)buf[1];
}
else{buffer[j++]=s.ch



java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.
只想知道 该用户已被删除
沙发
发表于 2015-1-21 10:15:11 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
乐观 该用户已被删除
板凳
发表于 2015-1-30 14:47:53 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
山那边是海 该用户已被删除
地板
发表于 2015-2-2 21:24:26 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
不帅 该用户已被删除
5#
发表于 2015-2-3 12:55:37 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
爱飞 该用户已被删除
6#
发表于 2015-2-6 17:40:40 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
admin 该用户已被删除
7#
发表于 2015-2-8 14:31:01 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
变相怪杰 该用户已被删除
8#
发表于 2015-2-9 02:26:14 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
金色的骷髅 该用户已被删除
9#
发表于 2015-2-26 18:29:44 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
灵魂腐蚀 该用户已被删除
10#
发表于 2015-3-6 02:45:40 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
谁可相欹 该用户已被删除
11#
发表于 2015-3-6 22:37:58 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
活着的死人 该用户已被删除
12#
发表于 2015-3-13 08:09:50 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
分手快乐 该用户已被删除
13#
发表于 2015-3-15 21:47:29 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
蒙在股里 该用户已被删除
14#
发表于 2015-3-22 05:10:13 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
再现理想 该用户已被删除
15#
发表于 2015-3-31 18:01:06 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
小妖女 该用户已被删除
16#
 楼主| 发表于 2015-4-3 04:05:27 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
柔情似水 该用户已被删除
17#
发表于 2015-4-4 09:18:50 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
飘灵儿 该用户已被删除
18#
发表于 2015-4-10 08:16:47 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
莫相离 该用户已被删除
19#
发表于 2015-4-16 03:11:31 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
简单生活 该用户已被删除
20#
发表于 2015-4-17 09:19:59 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表