`
kanwoerzi
  • 浏览: 1647757 次
文章分类
社区版块
存档分类
最新评论

JAVA WEB应用开发中的中文问题 之一 字符串的输入

 
阅读更多
中文乱码问题是JAVA WEB开发新手经常碰到的问题,这个问题其实不复杂,只要开发者对WEB开发整个环境有清楚的认识,还是很容易解决的。

因为Java语言内部是使用UNICODE表示字符串的,所以进入JVM和离开JVM的字符串都需要转换成UNCODE形式。

在JAVA WEB开发过程中,程序的部份是JSP或者HttpServlet,字符串有三个主要的进入点:html form、源程序、外部数据源(常见有数据库和资源文件)。

先说说源程序。

我们经常会在源程序里写一些文本,特别是在JSP里,“写”的时候是通过编辑器保存成文件的,所以首先要搞清楚的是:编辑器把文件保存成什么编码格式了?以VIM为例,它会以系统默认语言编码来保存文件,比如在MS Windows里区域设成中国,那么会以cp936编码字符串,cp936其实就是GB2312。但可以通过:set encoding或者:set fileencoding来改变。

接下来源程序要被编译器转换成字节码,其中jsp要先编译成.java,然后跟Servlet一样编译成.class,要保证编译器以正确的编码读入源文件,然后编译器就能以正确的格式转换并将字符串写进字节码里。

最后,JVM会加载字节码,并将字符串以UCS16的形式放在内存里。只要前面各步转换过程无误,这一步就能正常工作。这个环节,应用开发及布署人员无法控制的。

源程序里的字符串又可以分成两种,jsp里的静态部份以及由程序动态输出的部份。jsp在经过编译成.java后,也会变成通过out.print()输出,实际上跟用程序输出的部份没有本质的区别。对于Servlet或者jsp里的scriptlet来说,硬编码进字符串常量并不是一个好习惯,但是对于国际化要求不高的应用确实非常方便,还是经常会有人这样做的。

静态文本只要上面提到的各步转换无误,最后就能正确的进入Servlet Container了。

再说外部数据源。

外部数据源里的字符串会以某种格式编码保存着,通过一个转换程序被读进来。对于一般文件来说,这个转换程序是iostream库,对于resouce bundle文件来说转换过程是ResouceBundle的property读取方法,对于数据库来说是JDBC Driver里ResultSet的getString()方法。这里面潜藏着:字符串是以何种编码保存在存储器里,服务程序(文件系统或DBMS)是以何种编码传递给转换程序的,服务程序在传递之前是否进行过编码转换及转换是否正确,转换程序认为会收到的编码与实际收到的编码是否一致,转换程序工作是否正常等多个问题。不过说着复杂,其实写程序还是很简单的,无非给jdbc url加个参数指示编码格式或者在构造Reader时加个Charset参数,只有碰到问题时,才需要一步一步排查。

最麻烦的,就是最重要的html form。

form是WEB应用中用户输入信息的主要手段,form由浏览器显示,并在用户点击submit之后将其内容打包通过http协议提交给服务器端。

form通常会以GET或者POST方法提交,两种情况下浏览器传送的方法会略有不同。GET只能是application/x-www-form-urlencoded,form字段是做为url的一部份提交的;而POST可能是application/x-www-form-urlencoded或者multipart/form-data,form字段是做为http包的内容提交的。这个差异会导致某些应用碰到某些form需要从ISO 8859_1转码而另一些则无须转换直接就是对的。

现在的事实标准是浏览器将会以html页面本身显示时确定的字符编码,对form内的文字符串进行编码,然后上传。

WEB Container收到URL请求之后,会根据特写的映射机制发现应该转给Servlet Container
(Apache详见modjk),Servlet Container收到HTTP请求之后,会构造一个HttpServletRequest对象,然后根据url mapping将Request对象传给HttpServlet。

HttpServlet实例收到HttpServletRequest参数之后,可以调用getCharacterEncoding()方法查询字符编码格式,不过不幸的是,事实上该方法会返回null。不过根据浏览提交form的行为,收到Request里字符编码格式完全是可以预测的,所以先setCharacterEncoding()一下,HttpServletRequest就可以正常工作了。

关于html form提交中的编码问题,更进一步的说明可以参考这里

分享到:
评论

相关推荐

    精通Java:JDK、数据库系统开发Web开发(实例代码)

    《精通Java:JDK、数据库系统开发Web开发》全书共分27章,内容涵盖了Java编程环境概述、基础语法、面向对象软件设计方法、线程、数据集合、网络编程、图形编程、多媒体编程以及Java Web开发。本书每一节的例子都是...

    从零开始学Java资源包

    全书内容分为六篇共23章,讲解了Java的各个方面,主要内容包括Java语言的环境配置、基本语法、流程控制语句、字符串处理、数组、面向对象、图形界面设计、输入/输出、异常处理、网络编程、数据库及Java Web基础JSP和...

    开发JSF应用程序(与Web有关)

    Java Server Faces (JSF) 提供了令人兴奋的可视化开发 J2EE Web应用程序的新的开发环境。如果没有 JSF,开发人员必须书写处理几乎所有用户和应用程序之间的交互的代码。非 JSF Web 应用程序使用 HTML 控件来处理用户...

    java源码包---java 源码 大量 实例

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    java源码包2

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...

    JAVA上百实例源码以及开源项目源代码

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    JAVA上百实例源码以及开源项目

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    java源码包4

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...

    java开发常用jar包

    Sitemesh 是一个基于WEB页面的布局、装饰以及应用整合的开源框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的 banner,一致的版权,等等。它不仅仅能处理动态的内容,...

    java源码包3

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...

    Python变量的输入输出-格式化输出字符串变量

    自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛应用于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心学习从入门...

    java开源包10

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包11

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包101

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

Global site tag (gtag.js) - Google Analytics