URL传递中文解决方案
2012年05月27日


首先,弄清楚为什么url传递中文会转码或者乱码,以及http头

contentType="text/html; charset=GBK"

的作用。

html代码会经过web服务器,浏览器处理,所以造成转码或者乱码的原因,可能涉及到:页面本身的设置、web服务器的设置、浏览器的设置

 

在动态页面,比如jsp、php中,可以设置

contentType="text/html; charset=GBK"

在服务器,比如apache中可以在web.xml中设置

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="utf-8"/>

在Spring、Struts等插件中还可以配置页面过滤器

在IE等浏览器中可以设置强制的url编码规则

 

但是按照网络标准RFC-1738规定,一般的浏览器都是以utf-8或者gbk等方式来编码url的

 

解决乱码要从根源入手,根源是什么?刚才我说了,处理html的顺序是:页面本身的设置、web服务器的设置、浏览器的设置。那么最有效的方式就是照顾到浏览器

 

在web.xml或者Spring、Struts等中我们都不用管,因为他们是间接的方式,不一定其作用

 

怎么照顾到浏览器?就是将url的编码规则自己指定。接收的时候自己解码

 

制定url编码规则很简单,就是将url先用utf-8编码,编码结果是英文、数字、百分号等符合网络标准RFC-1738的格式。

 

编码的方法可以在服务器端的程序中进行,但那样效率太低。Javascript已经做好了这方面的工作,只需要调用encodeURI()或者encodeURIComponent()函数即可。

 

要在href、src等处调用javascript的函数,方法如下:

一、在HTML里可以通过"javascript:"方式调用JavaScript的函数或方法,如下所示:

<html>

 <head>

  <title>使用“javascript:”</title>

 </head>

 <body>

  <a href="javascript:alert('您点击了这个超链接')">请点我</a>  

 </body>

</html>

二、  "javascript:"不但可以调用JavaScript的方法,也可以调用用户自定义的函数,如下代码所示:

<html>

 <head>

  <title>使用“javascript:”</title>

  <script language="javascript" type="text/javascript">

   <!--

    function OnclickLink()

    {

     alert("您点击了这个按钮");

    }

   -->

  </script>

 </head>

 <body>

  <a href="javascript:OnclickLink()">请点我</a>

 </body>

</html>


三、与事件结合

<html>

 <head>

  <title>与事件相结合</title>

  <script language="javascript" type="text/javascript">

   <!--

    function OnMouseOverLink()

    {

     alert("您的鼠标从第一个超链接上划过");

    }

   -->

  </script>

 </head>

 <body>

  <a href="#" onmouseover="OnMouseOverLink()">请将鼠标放在上面</a><br>

  <a href="#" onclick="javascript:alert('您点击了第二个超链接')">请点我</a>  

 </body>

</html>

 

传递中文URL的解决方案如下

<a href="javascript:location=encodeURI('/zollty/search.jsp?form_project=金海湾');">金海湾</a>

点击超链接时实际上要激发javascript函数才其作用,我们不能写成如下形式:

<a href='encodeURI("/zollty/search.jsp?form_project=金海湾")'>金海湾</a>

因为上面的写法在未点击超链接时,href的值就是包含javascript代码的原原本本的字符串,点击后才执行encodeURI()函数,而超链接会以url为“encodeURI("/zollty/search.jsp?form_project=金海湾”来跳转,显然是找不到这个页面的。

 

最好是写成如下形式:

<a href="javascript:void(0)" onclick="location.href=encodeURI('/zollty/search.jsp?form_project=金海湾');">金海湾</a>

其含义更加明了。

 

另外就是表单中提交中文的问题,通过设置页面的

contentType="text/html; charset=GBK"

就可以解决。