上周编辑反馈我一个奇怪的Bug:很多文章编辑后,就只有一半的内容了!
我很纳闷,怎么会有这样的Bug呢?
等我去看过了问题所在,终于明白了:
程序运行后页面的源码是:
- <input name='title' value="我的朋友("***")"/>
原来在标题中也有双引号,所以firefox以为这是一个Html属性的结束,所以input中的内容是:
我的朋友(”,后面的内容都没有了。
这不简单我马上改好了:
- <input name='title' value="<?php echo urlencode($title);?>" class ='urlencode'>
- <script >
- $(document).ready(
- function(){
- $("input.urlencode").val(decodeURI($("input.urlencode").val()));
- </script>
这是jquery的语法。我是在输出数据时先urlencode一下,这样在input的value项中就没有引号了。
然后在客户端加载后完以后,把这个值改成decodeURI计算出来的值,也就是相当于php的一个urldecode操作。
这下以为好了,谁想一测,还不对。有%2C和加号在标题里。
再Google一下,说是javascript中解密urlencode用decodeURIComponent函数要好一些。urldecode无法正常求解包含有英文逗号和加号的串urlencode后的结果。urlencodeURI无法解含有加号的串urlencode后的结果。
现在我只好写了一个先把密文中的加号换成secret串用decodeURIComponent操作,然后再把secret串换回加号。服务器端仍是先urlencode再输出来,客户端这样进行urldecode解码:
- <script language="javascript">
- String.prototype.Replace=function(a,b)
- {
- var str=new String(this);
- while(str.indexOf(a)>-1)
- {
- str=str.replace(a,b);
- }
- return str;
- }
- function myURIdecode(str)
- {
- var secret='t834ghdt374hgdu7g2rtehuer';
- var tmp=str.Replace("+",secret);
- tmp=decodeURIComponent(tmp);
- tmp=tmp.Replace(secret," ");
- return tmp;
- }
- </script>
这样,才是正确的对应于php端的urldecode的javascript版的解码函数。
注意,我的php是utf-8的。如果是gb2312,需要更麻烦一些。因为javascript好像一般是utf-8的内码操作。
现在bug好像越来越多,忙不过来了。得上bug系统了。
Tag:
相关文章