JAVA教程之Java中文成绩详解(妙手必读)
先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。成绩|详解|中文我来讲一下tomcat怎样完成JSP的你就分明了。准备常识:
1.字节和unicode
Java内核是unicode的,就连class文件也是,可是良多媒体,包含文件/流的保留体例
是利用字撙节的。因而Java要对这些字撙节经行转化。char是unicode的,而byte是字节.
Java中byte/char互转的函数在sun.io的包两头有。个中ByteToCharConverter类是中调剂,
能够用来告知你,你用的Convertor。个中两个很经常使用的静态函数是
publicstaticByteToCharConvertergetDefault();
publicstaticByteToCharConvertergetConverter(Stringencoding);
假如你不指定converter,则体系会主动利用以后的Encoding,GB平台上用GBK,EN平台上用
8859_1
我们来就一个复杂的例子:
"你"的gb码是:0xC4E3,unicode是0x4F60
你用:
--encoding="gb2312";
--byteb[]={(byte)u00c4,(byte)u00E3};
--convertor=ByteToCharConverter.getConverter(encoding);
--char[]c=converter.convertAll(b);
--for(inti=0;i<c.length;c++)
--{
--System.out.println(Integer.toHexString(c));
--}
--打印出来是0x4F60
--可是假如利用8859_1的编码,打印出来是
--0x00C4,0x00E3
----例1
反过去:
--encoding="gb2312";
charc[]={u4F60};
convertor=ByteToCharConverter.getConverter(encoding);
--byte[]b=converter.convertAll(c);
--for(inti=0;i<b.length;c++)
--{
--System.out.println(Integer.toHexString(b));
--}
--打印出来是:0xC4,0xE3
----例2
--假如用8859_1就是0x3F,?号,暗示没法转化 --
良多中文成绩就是从这两个最复杂的类派生出来的。而却有良多类
不间接撑持把Encoding输出,这给我们带来诸多方便。良多程序可贵用encoding
了,间接用default的encoding,这就给我们移植带来了良多坚苦
--
2.UTF-8
--UTF-8是和Unicode逐一对应的,实在现很复杂
--
--7位的Unicode:0_______
--11位的Unicode:110_____10______
--16位的Unicode:1110____10______10______
--21位的Unicode:11110___10______10______10______
--年夜多半情形是只利用到16位以下的Unicode:
--"你"的gb码是:0xC4E3,unicode是0x4F60
--我们仍是用下面的例子
-- --例1:0xC4E3的二进制:
-- -- 1100010011100011
-- -- 因为只要两位我们依照两位的编码来排,可是我们发明这行欠亨,
-- -- 由于第7位不是0因而,前往"?"
-- --
-- --例2:0x4F60的二进制:
-- -- 0100111101100000
-- -- 我们用UTF-8补齐,酿成:
-- -- 111001001011110110100000
-- -- E4--BD--A0
-- -- 因而前往0xE4,0xBD,0xA0
-- --
3.String和byte[]
--String实在中心是char[],但是要把byte转化成String,必需经由编码。
--String.length()实在就是char数组的长度,假如利用分歧的编码,很可
--能会错分,形成散字和乱码。
--例:
----byte[]b={(byte)u00c4,(byte)u00e3};
----Stringstr=newString(b,encoding); ----
----假如encoding=8859_1,会有两个字,可是encoding=gb2312只要一个字 ----
--这个成绩在处置分页是常常产生
4.Reader,Writer/InputStream,OutputStream
--Reader和Writer中心是char,InputStream和OutputStream中心是byte。
--可是Reader和Writer的次要目标是要把Char读/写InputStream/OutputStream
--一个reader的例子:
--文件test.txt只要一个"你"字,0xC4,0xE3--
--Stringencoding=;
--InputStreamReaderreader=newInputStreamReader(
----newFileInputStream("text.txt"),encoding);
--char[]c=newchar;
--intlength=reader.read(c);
--for(inti=0;i<c.length;i++)
----System.out.println(c);
--假如encoding是gb2312,则只要一个字符,假如encoding=8859_1,则有两个字符
--------
--
--
----
2.我们要对Java的编译器有所懂得:
--javac-encoding
我们经常没有效到ENCODING这个参数。实在Encoding这个参数关于跨平台的操纵是很主要的。
假如没有指定Encoding,则依照体系的默许Encoding,gb平台上是gb2312,英文平台上是ISO8859_1。
--Java的编译器实践上是挪用sun.tools.javac.Main的类,对文件举行编译,这个类 --
有compile函数两头有一个encoding的变量,-encoding的参数实在间接传给encoding变量。
编译器就是依据这个变量来读取java文件的,然后把用UTF-8情势编译成class文件。
一个例子:
--publicvoidtest()
--{
----Stringstr="你";
----FileWriterwrite=newFileWriter("test.txt");
----write.write(str);
----write.close();
--}
----例3
--假如用gb2312编译,你会找到E4BDA0的字段
--
--假如用8859_1编译,
--00C400E3的二进制:
--00000000110001000000000011100011--
--由于每一个字符都年夜于7位,因而用11位编码:
--11000001100001001100001110100011
--C1--84-- C3-- A3
--你会找到C184C3A3--
可是我们常常疏忽失落这个参数,因而如许常常会有跨平台的成绩:
-- 例3在中文平台上编译,天生ZhClass
-- 例3在英文平台上编译,输入EnClass
--1. ZhClass在中文平台上实行OK,可是在英文平台上不可
--2. EnClass在英文平台上实行OK,可是在中文平台上不可
缘故原由:
--1.在中文平台上编译后,实在str在运转态的char[]是0x4F60, ----
--在中文平台上运转,FileWriter的缺省编码是gb2312,因而
--CharToByteConverter会主动用挪用gb2312的converter,把str转化
--成byte输出到FileOutputStream中,因而0xC4,0xE3放进了文件。
--可是假如是在英文平台下,CharToByteConverter的缺省值是8859_1,
--FileWriter会主动挪用8859_1往转化str,可是他没法注释,因而他会
--输入"?" ----
--2. 在英文平台上编译后,实在str在运转态的char[]是0x00C40x00E3, ----
--在中文平台上运转,中文没法辨认,因而会呈现??
-- 在英文平台上,0x00C4-->0xC4,0x00E3->0xE3,因而0xC4,0xE3被放进了
--文件
----
1.关于JSP注释的注释:
--Tomcat起首看一下你的叶面中有无"<%@pageinclude的标记。有,则在不异
--中央设定response.setContentType(..);依照encoding的来读,没有他依照8859_1
--读取文件,然后用UTF-8写成.java文件,然后用sun.tools.Main往读取这个文件,
--(固然它利用UTF-8往读),然后编译成class文件
--setContentType改动的是out的属性,out变量缺省的encoding是8859_1
2.对Parameter的注释
--很不幸Parameter只要ISO8859_1的注释,这个原料能够在servlet的完成代码中找到。
3.对include的注释
格局的,可是很不幸,因为谁人写"org.apache.jasper.compiler.Parser"的人
在数组JspUtil.ValidAttribute[]健忘加了一个参数:encoding,因而招致不支
持这类体例。你完整能够编译源代码,加上对encoding的撑持
总结:
假如你在NT底下,最复杂的办法就是棍骗java,不加任何Encoding变量:
<html>
你好<%=request.getParameter("value")%>
</html>
http://localhost/test/test.jsp?value=你
了局:你好你
但这类办法范围性较年夜,好比对上传的文章分段,如许的做法是逝世定的,最好的
办理计划是用这类计划:
<%@pagecontentType="text/html;charset=gb2312"%>
<html>
你好<%=newString(request.getParameter("value").getBytes("8859_1"),"gb2312")%>
</html>
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 是一种使用者不需花费很多时间学习的语言 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? Java是一种计算机编程语言,拥有跨平台、面向对java 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
页:
[1]
2