仓酷云

标题: JAVA教程之中文显现道理研讨 [打印本页]

作者: 金色的骷髅    时间: 2015-1-18 11:29
标题: JAVA教程之中文显现道理研讨
他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。显现|中文准备常识:
 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[i]));
     --}
     --打印出来是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[i]));
     --}
      --打印出来是: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[10];
--intlength=reader.read(c);
--for(inti=0;i<c.length;i++)
----System.out.println(c[i]);
  --假如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>


必读好文,但办理计划不敢奉承


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

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

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

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


Re:必读好文,但办理计划不敢奉承


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

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傍边的传送性。

看来我要在这里申明一下了


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

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,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。
作者: admin    时间: 2015-1-21 07:47
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 再见西城    时间: 2015-1-30 11:50
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 不帅    时间: 2015-2-6 11:06
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 第二个灵魂    时间: 2015-2-7 10:06
是一种使用者不需花费很多时间学习的语言
作者: 老尸    时间: 2015-2-8 02:25
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 乐观    时间: 2015-2-22 14:50
Java 编程语言的风格十分接近C、C++语言。
作者: 山那边是海    时间: 2015-2-26 03:07
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 活着的死人    时间: 2015-2-28 17:01
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 柔情似水    时间: 2015-3-10 02:45
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 飘灵儿    时间: 2015-3-17 04:09
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
作者: 爱飞    时间: 2015-3-17 04:09
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 精灵巫婆    时间: 2015-3-23 18:18
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2