JAVA网站制作之关于Servlet、Jsp中的多国言语显现 --...
首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。js|servlet|显现/***有伴侣有云云苦心之作,其实感激,信任它不会怪我转贴吧,他的email是vividq@china.com
*/
关于Servlet、Jsp中的多国言语显现
由于一向不信Java竟会有不克不及混排显现多国言语的BUG,这个周末研讨了一下Servlet、Jsp的多国言语显现的成绩,也就是Servlet的多字符集成绩,因为我对字符集的观点还不是很明晰以是写出的工具一定是正确的,我是如许了解Java中的字符集的:在运转时,每一个字符串对象中存储的都是编码为UNICODE内码的(我以为一切的言语中都是有响应编码的,由于在盘算机外部字符串老是用内码来暗示的,只不外一样平常盘算机言语中的字符串编码时平台相干的,而Java则接纳了平台有关的UNICODE)。
Java从一个byte流中读取一个字符串时,将把平台相干的byte变化为平台有关的Unicode字符串。在输入时Java将把Unicode字符串变化为平台相干的byte流,假如某个Unicode字符在某个平台上不存在,将会输入一个?。举个例子:在中文Windows中,Java读出一个"GB2312"编码的文件(能够是任何流)到内存中机关字符串对象,将会把GB2312编码的笔墨变化为Unicode编码的字符串,假如把这个字符串输入又将会把Unicode字符串转化为GB2312的byte流或数组:"中文测试"----->"u4e2du6587u6d4bu8bd5"----->"中文测试"。
以下例程:
byte[]bytes=newbyte[]{(byte)0xd6,(byte)0xd0,(byte)0xce,(byte)0xc4,(byte)0xb2,(byte)0xe2,(byte)0xca,(byte)0xd4};//GBK编码的"中文测试"
java.io.ByteArrayInputStreambin=newjava.io.ByteArrayInputStream(bytes);
java.io.BufferedReaderreader=newjava.io.BufferedReader(newjava.io.InputStreamReader(bin,"GBK"));
Stringmsg=reader.readLine();
System.out.println(msg)
这段程序放到包括"中文测试"这四个字的体系(如中文体系)中,能够准确地打印出这些字。msg字符串中包括了准确的"中文测试"的Unicode编码:"u4e2du6587u6d4bu8bd5",打印时转换为操纵体系的默许字符集,是不是能够准确显现依附于操纵体系的字符集,只要在撑持响应字符集的体系中,我们的信息才干准确的输入,不然失掉的将会是渣滓。
话进正题,我们来看看Servlet/Jsp中的多言语成绩。我们的方针是,任一国度的客户端经由过程Form向Server发送信息,Server把信息存进数据库中,客户端在检索时仍旧可以看到本人发送的准确信息。现实上,我们要包管,终极Server中的SQL语句中保留的时包括客户端发送笔墨的准确Unicode编码;DBC与数据库通信时接纳的编码体例能包括客户端发送的笔墨信息,现实上,最好让JDBC间接利用UNICODE/UTF8与数据库通信!如许就能够确保不会丧失信息;Server向客户端发送的信息时也要接纳不丧失信息的编码体例,也能够是Unicode/Utf8。
假如不指定Form的Enctype属性,Form将把输出的内容按照以后页面的编码字符集urlencode以后再提交,服务器端失掉是urlencoding的字符串。编码后失掉的urlencoding字符串是与页面的编码相干的,如gb2312编码的页面提交"中文测试",失掉的是"%D6%D0%CE%C4%B2%E2%CA%D4",每一个"%"后跟的是16进制的字符串;而在UTF8编码时失掉的倒是"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95",由于GB2312编码中一个汉字是16位的,而UTF8中一个汉字倒是24位的。中日韩三国的ie4以上扫瞄器均撑持UTF8编码,这类计划一定包容了这三国言语,以是我们假如让Html页面利用UTF8编码那末将最少能够撑持这三国言语。
可是,假如我们html/Jsp页面利用UTF8编码,由于使用程序服务器大概不晓得这类情形,由于假如扫瞄器发送的信息不包括charset信息,最多Server晓得读到Accept-Language哀求招标,我们晓得仅靠这个招标是不克不及获知扫瞄器所接纳编码的,以是使用程序服务器不克不及准确剖析提交的内容,为何?由于Java中的一切字符串都是Unicode16位编码的,HttpServletRequest.request(String)的功效就是把客户端提交的Urlencode编码的信息转为Unicode字符串,有些Server只能以为客户真个编码和Server平台不异,复杂地利用URLDecoder.decode(String)办法间接解码,假如客户端编码刚好和Server不异,那末就能够失掉准确地字符串,不然,假如提交地字符串中包括了外地字符,那末将会招致渣滓信息。
在我提出的这个办理计划里,已指定了接纳Utf8编码,以是,能够制止这个成绩,我们能够本人定制出decode办法:
publicstaticStringdecode(Strings,Stringencoding)throwsException{
StringBuffersb=newStringBuffer();
for(inti=0;i<s.length();i++){
charc=s.charAt(i);
switch(c){
case+:
sb.append();
break;
case%:
try{
sb.append((char)Integer.parseInt(
s.substring(i+1,i+3),16));
}
catch(NumberFormatExceptione){
thrownewIllegalArgumentException();
}
i+=2;
break;
default:
sb.append(c);
break;
}
}
//Undoconversiontoexternalencoding
Stringresult=sb.toString();
byte[]inputBytes=result.getBytes("8859_1");
returnnewString(inputBytes,encoding);
}
这个办法能够指定encoding,假如把它指定为UTF8就满意了我们的必要。好比用它剖析:"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95"就能够失掉准确的汉字"中文测试"的Unicode字符串。
如今的成绩就是我们必需失掉客户端提交的Urlencode的字符串。关于method为get的form提交的信息,能够用HttpServletRequest.getQueryString()办法读到,而关于post办法的form提交的信息,只能从ServletInputStream中读到,现实上尺度的getParameter办法被第一次挪用后,form提交的信息就被读掏出来了,而ServletInputStream是不克不及反复读出的。以是我们应在第一次利用getParameter办法前读取并剖析form提交的信息。
我是这么做的,创建一个Servlet基类,掩盖service办法,在挪用父类的service办法前读取并剖析form提交的内容,请看上面的源代码:
packagecom.hto.servlet;
importjavax.servlet.http.HttpServletRequest;
importjava.util.*;
/**
*Insertthetypesdescriptionhere.
*Creationdate:(2001-2-415:43:46)
*@author:钱卫春
*/
publicclassUTF8ParameterReader{
Hashtablepairs=newHashtable();
/**
*UTF8ParameterReaderconstructorcomment.
*/
publicUTF8ParameterReader(HttpServletRequestrequest)throwsjava.io.IOException{
super();
parse(request.getQueryString());
parse(request.getReader().readLine());
}
/**
*UTF8ParameterReaderconstructorcomment.
*/
publicUTF8ParameterReader(HttpServletRequestrequest,Stringencoding)throwsjava.io.IOException{
super();
parse(request.getQueryString(),encoding);
parse(request.getReader().readLine(),encoding);
}
publicstaticStringdecode(Strings)throwsException{
StringBuffersb=newStringBuffer();
for(inti=0;i<s.length();i++){
charc=s.charAt(i);
switch(c){
case+:
sb.append();
break;
case%:
try{
sb.append((char)Integer.parseInt(
s.substring(i+1,i+3),16));
}
catch(NumberFormatExceptione){
thrownewIllegalArgumentException();
}
i+=2;
break;
default:
sb.append(c);
break;
}
}
//Undoconversiontoexternalencoding
Stringresult=sb.toString();
byte[]inputBytes=result.getBytes("8859_1");
returnnewString(inputBytes,"UTF8");
}
publicstaticStringdecode(Strings,Stringencoding)throwsException{
StringBuffersb=newStringBuffer();
for(inti=0;i<s.length();i++){
charc=s.charAt(i);
switch(c){
case+:
sb.append();
break;
case%:
try{
sb.append((char)Integer.parseInt(
s.substring(i+1,i+3),16));
}
catch(NumberFormatExceptione){
thrownewIllegalArgumentException();
}
i+=2;
break;
default:
sb.append(c);
break;
}
}
//Undoconversiontoexternalencoding
Stringresult=sb.toString();
byte[]inputBytes=result.getBytes("8859_1");
returnnewString(inputBytes,encoding);
}
/**
*Insertthemethodsdescriptionhere.
*Creationdate:(2001-2-417:30:59)
*@returnjava.lang.String
*@paramnamejava.lang.String
*/
publicStringgetParameter(Stringname){
if(pairs==null||!pairs.containsKey(name))returnnull;
return(String)(((ArrayList)pairs.get(name)).get(0));
}
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 是一种为 Internet发展的计算机语言 是一种突破用户端机器环境和CPU 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 是一种突破用户端机器环境和CPU 是一种将安全性(Security)列为第一优先考虑的语言 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
页:
[1]