当前位置: 首页 > news >正文

沈阳 网站建设wordpress移动导航菜单

沈阳 网站建设,wordpress移动导航菜单,青浦手机网站建设,淮安网站建设推广说明#xff1a;本文为作者原创#xff0c;作者联系地址为#xff1a;josserchaiyahoo.com。由于Java编程中的中文问题是一个老生常谈的问题#xff0c;在阅读了许多关于Java中文问题解决方法之后#xff0c;结合作者的编程实践#xff0c;我发现过去谈的许多方法都不能清…说明本文为作者原创作者联系地址为josserchaiyahoo.com。由于Java编程中的中文问题是一个老生常谈的问题在阅读了许多关于Java中文问题解决方法之后结合作者的编程实践我发现过去谈的许多方法都不能清晰地说明问题及解决问题尤其是跨平台时的中文问题。于是我给出此篇文章内容包括对控制台运行的class、Servelets、JSP及EJB类中的中文问题我剖析和建议解决办法。希望大家指教。任何引用本文请注明出处Abstract本文深入分析了Java程序设计中Java编译器对java源文件和JVM对class类文件的编码/解码过程通过此过程的解析透视出了Java编程中中文问题产生的根本原因最后给出了建议的最优化的解决Java中文问题的方法。1、中文问题的来源计算机最初的操作系统支持的编码是单字节的字符编码于是在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。随着计算机的发展为了适应世界其它民族的语言(当然包括我们的汉字)人们提出了UNICODE编码它采用双字节编码兼容英文字符和其它民族的双字节字符编码所以目前大多数国际性的软件内部均采用UNICODE编码在软件运行时它获得本地支持系统(多数时间是操作系统)默认支持的编码格式然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。Java的JDK和JVM即是如此我这里说的JDK是指国际版的JDK我们大多数程序员使用的是国际化的JDK版本以下所有的JDK均指国际化的JDK版本。我们的汉字是双字节编码语言为了能让计算机处理中文我们自己制定的gb2312、GBK、GBK2K等标准以适应计算机处理的需求。所以大部分的操作系统为了适应我们处理中文的需求均定制有中文操作系统它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。如中文Win2K默认采用的是GBK编码显示在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的即所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码注意GBK是在GB2312基础上扩充来的。由于Java语言内部采用UNICODE编码所以在JAVA程序运行时就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题这个转换过程有着一系列的步骤如果其中任何一步出错则显示出来的汉字就会出是乱码这就是我们常见的JAVA中文问题。同时Java是一个跨平台的编程语言也即我们编写的程序不仅能在中文windows上运行也能在中文Linux等系统上运行同时也要求能在英文等系统上运行(我们经常看到有人把在中文win2k上编写的JAVA程序移植到英文Linux上运行)。这种移植操作也会带来中文问题。还有有人使用英文的操作系统和英文的IE等浏览器来运行带中文字符的程序和浏览中文网页它们本身就不支持中文也会带来中文问题。几乎所有的浏览器默认在传递参数时都是以UTF-8编码格式来传递而不是按中文编码传递所以传递中文参数时也会有问题从而带来乱码现象。总之以上几个方面是JAVA中的中文问题的主要来源我们把以上原因造成的程序不能正确运行而产生的问题称作JAVA中文问题。2、JAVA编码转换的详细过程我们常见的JAVA程序包括以下类别*直接在console上运行的类(包括可视化界面的类)*JSP代码类(注JSP是Servlets类的变型)*Servelets类*EJB类*其它不可以直接运行的支持类这些类文件中都有可能含有中文字符串并且我们常用前三类JAVA程序和用户直接交互用于输出和输入字符如我们在JSP和Servlet中得到客户端送来的字符这些字符也包括中文字符。无论这些JAVA类的作用如何这些JAVA程序的生命周期都是这样的*编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java扩展名保存在操作系统中例如我们在中文win2k中用记事本编辑一个java源程序*编程人员用JDK中的javac.exe来编译这些源代码形成.class类(JSP文件是由容器调用JDK来编译的)*直接运行这些类或将这些类布署到WEB容器中去运行并输出结果。那么在这些过程中JDK和JVM是如何将这些文件如何编码和解码并运行的呢这里我们以中文win2k操作系统为例说明JAVA类是如何来编码和被解码的。第一步我们在中文win2k中用编辑软件如记事本编写一个Java源程序文件(包括以上五类JAVA程序)程序文件在保存时默认采用了操作系统默认支持GBK编码格式(操作系统默认支持的格式为file.encoding格式)形成了一个.java文件也即java程序在被编译前我们的JAVA源程序文件是采用操作系统默认支持的file.encoding编码格式保存的java源程序中含有中文信息字符和英文程序代码要查看系统的file.encoding参数可以用以下代码public class ShowSystemDefaultEncoding {public static void main(String[] args) {String encoding System.getProperty(file.encoding);System.out.println(encoding);}}第二步我们用JDK的javac.exe文件编译我们的Java源程序由于JDK是国际版的在编译的时候如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式则javac.exe首先获得我们操作系统默认采用的编码格式也即在编译java程序时若我们不指定源程序文件的编码格式JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式如WIN2k它的值为GBK)然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后javac把转换后的unicode格式的文件进行编译成.class类文件此时.class文件是UNICODE编码的它暂放在内存中紧接着JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件它内部包含我们源程序中的中文字符串只不过此时它己经由file.encoding格式转化为UNICODE格式了。这一步中对于JSP源程序文件是不同的对于JSP这个过程是这样的即WEB容器调用JSP编译器JSP编译器先查看JSP文件中是否设置有文件编码格式如果JSP文件中没有设置JSP文件的编码格式则JSP编译器调用JDK先把JSP文件用JVM默认的字符编码格式(也即WEB容器所在的操作系统的默认的file.encoding)转化为临时的Servlet类然后再把它编译成UNICODE格式的class类并保存在临时文件夹中。如在中文win2k上WEB容器就把JSP文件从GBK编码格式转化为UNICODE格式然后编译成临时保存的Servlet类以响应用户的请求。第三步运行第二步编译出来的类分为三种情况A、直接在console上运行的类B、EJB类和不可以直接运行的支持类(如JavaBean类)C、JSP代码和Servlet类D、JAVA程序和数据库之间下面我们分这四种情况来看。A、直接在console上运行的类这种情况运行该类首先需要JVM支持即操作系统中必须安装有JRE。运行过程是这样的首先java启动JVM此时JVM读出操作系统中保存的class文件并把内容读入内存中此时内存中为UNICODE格式的class类然后JVM运行它如果此时此类需要接收用户输入则类会默认用file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存(用户可以设置输入流的编码格式)。程序运行后产生的字符串(UNICODE编码的)再回交给JVM最后JRE把此字符串再转化为file.encoding格式(用户可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。对于这种直接在console上运行的类它的转化过程可用图1更加明确的表示出来图1以上每一步的转化都需要正确的编码格式转化才能最终不出现乱码现象。B、EJB类和不可以直接运行的支持类(如JavaBean类)由于EJB类和不可以直接运行的支持类它们一般不与用户直接交互输入和输出它们常常与其它的类进行交互输入和输出所以它们在第二步被编译后就形成了内容是UNICODE编码的类保存在操作系统中了以后只要它与其它的类之间的交互在参数传递过程中没有丢失则它就会正确的运行。这种EJB类和不可以直接运行的支持类,它的转化过程可用图2更加明确的表示出来图2C、JSP代码和Servlet类经过第二步后JSP文件也被转化为Servlets类文件只不过它不像标准的Servlets一校存在于classes目录中它存在于WEB容器的临时目录中故这一步中我们也把它做为Servlets来看。对于Servlets客户端请求它时WEB容器调用它的JVM来运行Servlet首先JVM把Servlet的class类从系统中读出并装入内存中内存中是以UNICODE编码的Servlet类的代码然后JVM在内存中运行该Servlet类如果Servlet在运行的过程中需要接受从客户端传来的字符如表单输入的值和URL中传入的值此时如果程序中没有设定接受参数时采用的编码格式则WEB容器会默认采用ISO-8859-1编码格式来接受传入的值并在JVM中转化为UNICODE格式的保存在WEB容器的内存中。Servlet运行后生成输出输出的字符串是UNICODE格式的紧接着容器将Servlet运行产生的UNICODE格式的串(如html语法用户输出的串等)直接发送到客户端浏览器上并输出给用户如果此时指定了发送时输出的编码格式则按指定的编码格式输出到浏览器上如果没有指定则默认按ISO-8859-1编码发送到客户的浏览器上。这种JSP代码和Servlet类它的转化过程可用图3更加明确地表示出来图3D、Java程序和数据库之间对于几乎所有数据库的JDBC驱动程序默认的在JAVA程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式的所以我们的程序在向数据库内存储包含中文的数据时JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1的格式然后传递到数据库中在数据库保存数据时它默认即以ISO-8859-1保存所以这是为什么我们常常在数据库中读出的中文数据是乱码。对于JAVA程序和数据库之间的数据传递我们可以用图4清晰地表示出来图43、分析常见的JAVA中文问题几个必须清楚的原则首先经过上面的详细分析我们可以清晰地看到任何JAVA程序的生命期中其编码转换的关键过程是在于最初编译成class文件的转码和最终向用户输出的转码过程。其次我们必须了解JAVA在编译时支持的、常用的编码格式有以下几种*ISO-8859-18-bit,同8859_1,ISO-8859-1,ISO_8859_1等编码*Cp1252美国英语编码同ANSI标准编码*UTF-8同unicode编码*GB2312同gb2312-80,gb2312-1980等编码*GBK ,同MS936它是gb2312的扩充及其它的编码如韩文、日文、繁体中文等。同时我们要注意这些编码间的兼容关体系如下unicode和UTF-8编码是一一对应的关系。GB2312可以认为是GBK的子集即GBK编码是在gb2312上扩展来的。同时GBK编码包含了20902个汉字编码范围为0x8140-0xfefe所有的字符可以一一对应到UNICODE2.0中来。再次对于放在操作系统中的.java源程序文件在编译时我们可以指定它内容的编码格式具体来说用-encoding来指定。注意如果源程序中含有中文字符而你用-encoding指定为其它的编码字符显然是要出错的。用-encoding指定源文件的编码方式为GBK或gb2312无论我们在什么系统上编译含有中文字符的JAVA源程序都不会有问题它都会正确地将中文转化为UNICODE存储在class文件中。然后我们必须清楚几乎所有的WEB容器在其内部默认的字符编码格式都是以ISO-8859-1为默认值的同时几乎所有的浏览器在传递参数时都是默认以UTF-8的方式来传递参数的。所以虽然我们的Java源文件在出入口的地方指定了正确的编码方式但其在容器内部运行时还是以ISO-8859-1来处理的。4、中文问题的分类及其建议最优解决办法了解以上JAVA处理文件的原理之后我们就可以提出了一套建议最优的解决汉字问题的办法。我们的目标是我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的操作系统中正确运行或拿到其它操作系统中编译后能正确运行能正确地传递中文和英文参数能正确地和数据库交流中英文字符串。我们的具体思路是在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即可。具体解决办法如下1、针对直接在console上运行的类对于这种情况我们建议在程序编写时如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出程序中应该采用字符流来处理输入和输出具体来说应用以下面向字符型节点流类型对文件FileReaderFileWrieter其字节型节点流类型为FileInputStreamFileOutputStream对内存(数组)CharArrayReaderCharArrayWriter其字节型节点流类型为ByteArrayInputStreamByteArrayOutputStream对内存(字符串)StringReaderStringWriter对管道PipedReaderPipedWriter其字节型节点流类型为PipedInputStreamPipedOutputStream同时应该用以下面向字符型处理流来处理输入和输出BufferedWriterBufferedReader其字节型的处理流为BufferedInputeStreamBufferedOutputStreamInputStreamReaderOutputStreamWriter其字节型的处理流为DataInputStreamDataOutputStream其中InputStreamReader和InputStreamWriter用于将字节流按照指定的字符编码集转换到字符流如InputStreamReader in new InputStreamReader(System.inGB2312)OutputStreamWriter out new OutputStreamWriter (System.outGB2312)例如采用如下的示例JAVA编码就达到了要求//Read.javaimport java.io.*;public class Read {public static void main(String[] args) throws IOException {String str \n中文测试这是内部硬编码的串\ntest english character;String strin ;BufferedReader stdin new BufferedReader(new InputStreamReader(System.in,gb2312)); //设置输入接口按中文编码BufferedWriter stdout new BufferedWriter(new OutputStreamWriter(System.out,gb2312)); //设置输出接口按中文编码stdout.write(请输入:);stdout.flush();strin stdin.readLine();stdout.write(这是从用户输入的串strin);stdout.write(str);stdout.flush();}}同时在编译程序时我们用以下方式来进行javac -encoding gb2312 Read.java其运行结果如图5所示图52、针对EJB类和不可以直接运行的支持类(如JavaBean类)由于这种类它们本身被其它的类调用不直接与用户交互故对这种类来说我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样)同时在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。3、针对Servlet类针对Servlet我们建议用以下方法在编译Servlet类的源程序时用-encoding指定编码为GBK或GB2312且在向用户输出时的编码部分用response对象的setContentType(text/html;charsetGBK);或gb2312来设置输出编码格式同样在接收用户输入时我们用request.setCharacterEncoding(GB2312)这样无论我们的servlet类移植到什么操作系统中只有客户端的浏览器支持中文显示就可以正确显示。如下是一个正确的示例//HelloWorld.javapackage hello;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{public void init() throws ServletException { }public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{request.setCharacterEncoding(GB2312); //设置输入编码格式response.setContentType(text/html;charsetGB2312); //设置输出编码格式PrintWriter out response.getWriter(); //建议使用PrintWriter输出out.println();out.println(Hello World! This is created by Servlet!测试中文!);out.println();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{request.setCharacterEncoding(GB2312); //设置输入编码格式response.setContentType(text/html;charsetGB2312); //设置输出编码格式String name request.getParameter(name);String id request.getParameter(id);if(namenull) name;if(idnull) id;PrintWriter out response.getWriter(); //建议使用PrintWriter输出out.println();out.println(你传入的中文字串是 name);out.println(你输入的id是 id);out.println();}public void destroy() { }}请用javac -encoding gb2312 HelloWorld.java来编译此程序。测试此Servlet的程序如下所示function Submit() {//通过URL传递中文字符串值给Servletdocument.base.action ./HelloWorld?name中文;document.base.method POST;document.base.submit();}传给Servlet其运行结果如图6所示图64、JAVA程序和数据库之间为避免JAVA程序和数据库之间数据传递出现乱码现象我们建议采用以下最优方法来处理1、对于JAVA程序的处理方法按我们指定的方法处理。2、把数据库默认支持的编码格式改为GBK或GB2312的。如在mysql中我们可以在配置文件my.ini中加入以下语句实现在[mysqld]区增加default-character-setgbk并增加[client]default-character-setgbk在SQL Server2K中我们可以将数据库默认的语言设置为Simplified Chinese来达到目的。5、针对JSP代码由于JSP是在运行时由WEB容器进行动态编译的如果我们没有指定JSP源文件的编码格式则JSP编译器会获得服务器操作系统的file.encoding值来对JSP文件编译的它在移植时最容易出问题如在中文win2k中可以很好运行的jsp文件拿到英文linux中就不行尽管客户端都是一样的那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的(在中文wink中的file.encoding和在英文Linux中file.encoding是不同的且英文Linux的file.encoding对中文不支持所以编译出来的JSP类就会有问题)。网络上讨论的大多数是此类问题多是因为JSP文件移植平台时不能正确显示的问题对于这类问题我们了解了JAVA中程序编码转换的原理解决起来就容易多了。我们建议的解决办法如下1、我们要保证JSP向客户端输出时是采用中文编码方式输出的即无论如何我们首先在我们的JSP源代编中加入以下一行2、为了让JSP能正确获得传入的参数我们在JSP源文件头加入下面一句3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件我们需要在JSP源文件中指定我们的JSP源文件的编码格式具体来说我们在JSP源文件头上加入下面的一句即可或这是JSP规范2.0新增加的指令。我们建议使用此方法来解JSP文件中的中文问题下面的代码是一个正确做法的JSP文件的测试程序//testchinese.jspString action request.getParameter(ACTION);String name ;String str ;if(action!null action.equals(SENT)){name request.getParameter(name);str request.getParameter(str);}%function Submit(){document.base.action ?ACTIONSENTstr传入的中文;document.base.method POST;document.base.submit();}提交if(action!null action.equals(SENT)){out.println(你输入的字符为name);out.println(你通过URL传入的字符为str);}%如图7是此程序运行的结果示意图图75、总结在上面的详细分析中我们清晰地给出了JAVA在处理源程序过程中的详细转换过程为我们正确解决JAVA编程中的中文问题提供了基础。同时我们给出了认为是最优的解决JAVA中文问题的办法。6、参考资料1、段明辉.Java编程技术中汉字问题的分析及解决.http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml2、周竞涛.关于Java中文问题的几条分析原则http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml7、作者介绍作者abnerchai高级程序员作者联系方法josserchaiyahoo.com
http://www.sadfv.cn/news/184220/

相关文章:

  • 网站建设数据库怎么选择宁远做网站
  • 免费建网站系统平台深圳专业建网站公司排行
  • 网站建设监理呼和浩特网站推广公司
  • 律师怎样做网站专业企业网站开发
  • 婚介 东莞网站建设浙江网缘科技有限公司
  • wordpress建站视频新网站多久会被百度收录
  • 网站建设需要学多久知乎wordpress主题 搜索
  • asp.net新建网站企业网站开发标准
  • 深圳做百度网站wordpress什么是分页
  • 公司网站设计规范网页设计实验报告遇到的问题
  • 长沙教育建设信息网站怎么样自己建立网站
  • 厚街做网站公司高端模版网站
  • 河南省建设厅官方网站李学军网站流量用完了
  • 赣州网站seo个人简历模板空白表格
  • 会计网站建设益阳网站制作公司
  • 医院 网站建设 新闻石家庄鹿泉网站建设
  • 个人做购物网站犯法吗eechina电子工程网
  • 景县做网站开广告店要懂哪些技术
  • 辽宁省建设工程信息网开标说明极限优化wordpress
  • 广州网站推广软件建筑设计官网
  • 手机网站开发是什么福州网站建设模板
  • 网站建设维护招聘wordpress加速r
  • 金沙网站怎么做代理忘记密码wordpress
  • 西安的电商平台网站建设wordpress主板不显示内容
  • 做推广任务的网站wordpress 小程序开发
  • 卡盟建设vip网站做招聘网站如何宣传
  • 广东网站建设公司968附近哪里有建设银行
  • 沈阳设计网站公司哪家好网站注册页面怎么做
  • 网站的色彩山东网站建设价格
  • 狼雨的网站凡科建网