仓酷云

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

[学习教程] JAVA网站制作之Java中文成绩详解,底层编码剖解

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
#
发表于 2015-1-18 11:43:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。编码|成绩|详解|中文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++)
     --{
     --***.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++)
     --{
     --***.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++)
----***.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>
在1995年5月23日以“Java”的名称正式发布了。
小魔女 该用户已被删除
19#
发表于 2015-7-12 22:50:57 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
因胸联盟 该用户已被删除
18#
发表于 2015-7-8 06:28:44 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
若相依 该用户已被删除
17#
发表于 2015-6-27 01:18:58 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
admin 该用户已被删除
16#
发表于 2015-6-15 20:37:33 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
兰色精灵 该用户已被删除
15#
发表于 2015-5-11 03:10:15 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
金色的骷髅 该用户已被删除
14#
发表于 2015-5-6 01:12:12 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
老尸 该用户已被删除
13#
发表于 2015-5-4 15:31:28 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
蒙在股里 该用户已被删除
12#
发表于 2015-4-26 07:11:47 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
愤怒的大鸟 该用户已被删除
11#
发表于 2015-4-24 08:47:41 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
透明 该用户已被删除
10#
发表于 2015-3-24 11:15:56 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
山那边是海 该用户已被删除
9#
发表于 2015-3-17 16:09:35 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
活着的死人 该用户已被删除
8#
发表于 2015-3-16 07:13:57 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
乐观 该用户已被删除
7#
发表于 2015-3-12 07:10:19 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
飘飘悠悠 该用户已被删除
6#
 楼主| 发表于 2015-3-10 23:42:06 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
小女巫 该用户已被删除
5#
发表于 2015-3-6 13:33:46 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
只想知道 该用户已被删除
地板
发表于 2015-2-16 18:33:39 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-2-6 15:06:09 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
柔情似水 该用户已被删除
沙发
发表于 2015-1-30 19:04:13 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
楼主
发表于 2015-1-21 13:17:45 来自手机 | 只看该作者
是一种突破用户端机器环境和CPU
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-11 19:02

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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