飘飘悠悠 发表于 2015-1-18 11:55:33

JAVA教程之Java中文成绩详解(转)

windows系统样,他们做了什么事或者留了一些后门程序,谁都不知道,二,java开发是跨平台,任何系统上都可以运行,对于保密型系统和大型系统开发这是必要的成绩|详解|中文我来讲一下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     --{
     --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     --{
     --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----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起首看一下你的叶面中有无"


http://localhost/test/test.jsp?value=你

了局:你好你

但这类办法范围性较年夜,好比对上传的文章分段,如许的做法是逝世定的,最好的
办理计划是用这类计划:


你好



必读好文,但办理计划不敢奉承
讲话者:小熊
时间:2000/10/1717:21:31来自:www.javaunion.org


--------------------------------------------------------------------------------

1.网页传参数不倡始用get办法,并且用户能够调剂是不是用utf-8发送
2.倡议jsp中最好不要用,实践上加不加这句都有完成中文一般显现的计划,我以为不加便利些,最少不必写这些代码,以下的设置我以为可使中文一般显现:
a.一切的javabean用iso8859-1编译
b.jsp文件中不要写以上charset=gb2312的语句(写了反而错)

在tomcat情形下注重以上2点就行---了,等等,关于其他有大概不可的jsp服务器,加上以下
c.服务器上的操纵体系言语设为英文(像没有装相似bluepoint中文体系的linux一样平常原本就是英文)
就行---了

谁如果还不合错误,请呈报....


re:必读好文,但办理计划不敢奉承
讲话者:congling
时间:2000/10/1721:06:23来自:www.javaunion.org


--------------------------------------------------------------------------------

tomcat的参数成绩不管是get或是post体例都是用8859_1编码的。这个能够看tomcatservlet完成的源代码:
a)关于post办法
 javax.servlet.http.httputils的parsepostdata办法:(关于post的form数据)
 stringpostedbody=newstring(postedbytes,0,len,"8859_1");)这里是没有成绩的由于中文城市用%来讲明。可是parsename这个函数,却没有把是中文的工具整合起来,他只是复杂的拼集,因而能够认定他是利用8859_1的编码划定规矩
 sb.append((char)integer.parseint(s.substring(i+1,i+3),16));
----  i+=2;
--
b)关于get办法
 org.apache.tomcat.service.http.httprequestadapter
   -- line=newstring(buf,0,count,
      constants.characterencoding.default);
----constants.characterencoding.default=8859_1
 这段代码欠好跟踪,万万不要被一些假象利诱住。httprequestadapter是从requestimpl中派生的。可是,实践上用8080端口的server并没有间接用到requestimpl,而是用了httprequestadapter来取得querystring

关于加不加encoding,我保存我的定见,由于假如要办理上传文件分页成绩,必需要用他来编码。并且编码能包管在一些beans傍边的传送性。

看来我要在这里申明一下了
讲话者:小熊
时间:1970/01/0107:59:59来自:www.javaunion.org


--------------------------------------------------------------------------------

tomcat仅仅是一个对jsp1.1,servlet2.2的一个尺度的完成,我们不该该请求这个收费软件在仔细小节上和功能上都八面玲珑,它次要思索的英文用户,这也是为何不作特别转换我们的汉字用url办法传送有成绩的缘故原由,我们年夜部分扫瞄器ie其初级设置中一直以utf-8发送url的选项缺省是选上的,假如说这是tomcat的bug也是能够的,别的tomcat不论以后的操纵体系是甚么言语,仿佛都按iso8859往编译jsp,我以为也有点不当,可是不论怎样说,新尺度的完成和抢手的软件在言语的撑持方面永久都是先思索英文

我的计划甚么说要好一些呢
1.仍是那句话,英文国度的软件永久都是先思索英文,java假造机的标准中请求假造机外部必需完成iso8859,unicode,utf-8三种,其他的不作请求,我们用的jdk中的假造机就是如许,嵌进式的就更不必说了,也就是说其他的encode都极可能不是java假造机外部间接撑持的,我们的中文天然也不在其列,必要内部的包撑持转换,sunjdk应当在i18n.jar中,用iso8859速率最快,不必要别的挪用和互换甚么的,更没有读包的io操纵
2.最少少写了代码,没有分外操纵,简便的作风谁不喜好
3.所写的jsp页面国际性化好,我才写了一个jsp+javabeans的谈天室软件(没有效到servlet,jsp真切实其实实很好),一样的程序美国人用他们的扫瞄器进进就是英文界面,中文进进就是中文界面,假如加上charset=gb2312最少很贫苦
4.限制了gb2312,假如用户要用gbk,怎样办,不加更好,不论甚么的字符集,只需我以后扫瞄器设定的是,我就可以显现出来

总结:不管赶快度上,开辟效力上,和可扩大性上思索,我的计划都比你的好,别的,我找不到你的计划比我的好的中央
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,netbeans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。

admin 发表于 2015-1-21 17:09:41

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

海妖 发表于 2015-1-26 06:00:16

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

山那边是海 发表于 2015-2-4 13:14:57

是一种将安全性(Security)列为第一优先考虑的语言

仓酷云 发表于 2015-2-9 23:18:39

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

深爱那片海 发表于 2015-2-10 23:22:56

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

小女巫 发表于 2015-2-24 08:57:09

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

透明 发表于 2015-3-1 19:44:50

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

飘灵儿 发表于 2015-3-11 02:17:07

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。

金色的骷髅 发表于 2015-3-13 07:09:28

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

变相怪杰 发表于 2015-3-17 05:09:14

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

飘飘悠悠 发表于 2015-3-17 18:08:18

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

简单生活 发表于 2015-3-24 06:56:07

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

爱飞 发表于 2015-4-10 08:55:29

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

谁可相欹 发表于 2015-4-11 03:12:10

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

愤怒的大鸟 发表于 2015-4-13 01:16:28

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

精灵巫婆 发表于 2015-4-16 19:11:26

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。

兰色精灵 发表于 2015-4-19 08:16:41

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

乐观 发表于 2015-4-22 07:42:09

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

因胸联盟 发表于 2015-4-23 14:11:16

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
页: [1]
查看完整版本: JAVA教程之Java中文成绩详解(转)