java的web开发编码总结

1. 系统源文件的编码
 
     如java原文件,jsp文件。在系统编译时,系统如何识别文件格式,使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows根据txt文件的开头多出的几个字节来识别文件编码,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。如果系统识别不了,则系统一般根据操作系统的默认设置进行编译,如在中文windows 2000下tomcat一般会把jsp文件当作gb2312编码来处理。
 
2.tomcat请求读入处理

    tomcat默认的request请求以ISO_8859_1(不支持中文显示)读入,如果jsp页面的contenttype为UTF-8,则参数提交则以UTF-8提交,所以可以通过request.setCharacterEncoding把默认的读入从ISO_8859_1转成UTF-8,方法是可以使用过滤器。如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转为以UTF-8编码读入,关键一句:request.setCharacterEncoding("UTF-8")。(转成参数的编码格式读入)

3.tomcat写出

    tomcat默认的response输出也是以ISO_8859_1的形式。如果需要更改可以使用<%@page pageEncoding="gb2312"%>来更改tomcat的response输出(注意,该指令同时更改了编译处理该tomcat的jsp页面的编码。)

4.java内部存放以unicode存放

     new String(prop_value.getBytes("ISO_8859_1"), "gb2312"): prop_value字符串如果原来以iso_8859_1编码读入,即prop_value把原来读入的二进制映射成UNICODE存放(ISO_8859_1--->UNICODE映射,JAVA内部存放UNICODE值),getBytes把UNICODE值转回ISO_8859_1对应的二进制,同时构造函数又重新把他看作gb2312读入,即利用gb2312代码页把该二进制编码对应到unicode编码的二进制进行存放。
 
     例:在JSP页面中存在以下代码
 
     <%=WebUtils.getwebproperty("login.title")%>
 
     而getwebproperty代码如下:
 
    public static String getwebproperty(String prop_name) throws Exception {
        byte[] prop_value_byte;
        String prop_value = null;
        prop_value = sysconf.getProperty(prop_name);
        if (prop_value == null) {
            throw new Exception();
        }
        return prop_value;
    }
 
    sysconf中原文件使用gb2312编辑,由于properties文件默认以ISO_8859_1读入,则读入后prop_value即为该gb2312码的每个字拆分成二个字节(被看作ISO_8859_1)映射到UNICODE。如果原来properties里的字有个字是“你”,由于它的gb2312码是c4e3,则以ISO_8859_1读入则把它当作两个字节为c4,e3然后prop_value便是00c4,00e3(假设ISO_8859_1的c4变成unicode的00c4......),然后如果JSP代码使用默认编码处理(ISO_8859_1)的话,则相当于jsp的response的默认输出为ISO_8859_1,然后使用<%=WebUtils.getwebproperty("login.title")%>编译成java代码为out.write(WebUtils.getwebproperty("login.title")%),然后动态执行后往浏览器写的是00c4,00e3再转成ISO_8859_1,即为c4e3,如果客户端显示使用gb2312,则显示出来的就是正确的“你”。


5. 要使你的程序国际化,在原文件编码,request,response的输入输出上,以及jsp中默认的contenttype上都设置成UTF-8。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值