`
hhyyllgg
  • 浏览: 27528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编码理解

    博客分类:
  • java
 
阅读更多
我们都知道常见的编码有iso8859-1,GB2312/GBK , unicode,utf。
  • 1 iso8859-1 单字节,应用于英文系列,最多能表示的字符范围是0-255
  • 2 GB2312/GBK 汉子的国标码,专门用来表示汉字,是双字节编码,英文编码与iso8859-    1一样。 gbk兼容gb2312。
  • 3 unicode 这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)  编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何   编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字   节,比如字母'a'为"00 61"。 java内部就是使用unicode编码
  • 4 utf  考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以 unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节



  • 常见从b==》s请求过程中 如果提交的表单的form中指定了字符集的编码 则使用该编码,否则使用页面编码提交。如果直接在url中输入?后的参数 字符集编码为操作系统的编码
  • webServer获取的字节流默认以iso8859-1处理,所以一般情况下我们都是以过滤器设置服务器处理编码(request. setCharacterEncoding ())
  • 当系统输出字符的时候,会按指定编码输出,中文windows下,对于response(浏览器),则使用 jsp文件头指定的contentType,或者可以直接为response指定编码。同时,会告诉browser网页的编码。如果未指定,则会使用 iso8859-1编码。对于中文,应该为browser指定输出字符串的编码。
  •   浏览器显示网页时,首先使用response中指定的编码(jsp文件头指定的contentType最终也反映在response上),如果未指定,则会使用网页中meta项指定中的contentType



对于jsp文件
  •   1 :<%@page pageEncoding="GBK"%>指的是编译时的编码,请求时字符集以这个为准
  •   2 :<%@ page contentType="text/html; charset= GBK" %>指的是页面显示时的代码 和response.setCharacterEncoding("GBK")等效。
  •   3 :对与静态网页 则使用meta来指定编码 ,对于jsp页面以页头优先
对于url编码
  对于中文IE,如果在高级选项中取消总以UTF-8发送,则PathInfo和QueryString是URL encode按照GBK编码(其它如ff也是这种方式)。
  北京.html?a=北京

实际上提交是
GET %B1%B1%BE%A9?a=%B1%B1%BE%A9


如果选择是以UTF-8发送 则PathInfo使用的是utf-8编码 而QueryString使用的是gbk的编码
上一个实际提交的是
 GET %E5%8C%97%E4%BA%AC?a=%B1%B1%BE%A9


所以,由于客户端设置的不同,相同的链接,在服务器上得到了不同结果。这个问题不少人都遇到,却没有很好的解决办法。所以有的网站会建议用户尝试关闭 UTF-8选项。不过,有一个解决办法就只能是让自己的程序多一点智能:根据内容来分析编码。

比方说:

   if(uri.toUpperCase().startsWith("/%E5%8C%97%E4%BA%AC")){//北京的utf8编码
         //中文url,采用的是UTF-8编码
         cnuri = java.net.URLDecoder.decode(uri,"UTF-8");
        }
    if(uri.toUpperCase().startsWith("/%B1%B1%BE%A9")){//北京的gbk编码
         //中文url,采用的是UTF-8编码
         cnuri = java.net.URLDecoder.decode(uri,"GBK");
        } 
  if(uri.matches(".*(%u[\\w]{4}).*")){
         cnuri=uri.replace("%u", "\\u");
         cnuri =StringUtils.loadConvert(cnuri);
         //System.out.println("中文网址:"+cnuri+",需要转码");
        }
  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics