php处理网站url编码及乱码问题

     

           URL编码问题,简单的说,url规则,只允许接受ASCII编码的字符,而且是只是规定中的一部分字符,包括Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符,因此当url中有中文时,必须要对中文字符进行编码。

          同时,由于url规则,一些字符可能会引起歧义,所以也必须进行转码。例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。

         我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到 这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。

          比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了歧义。

          Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符代表一个字节的十六进制形式。通常的形式是%hh。

          当使用get方式提交时,各浏览器对中文的编码方式会不一样,可能是utf8,也可能是gb2312,这是由不同浏览器决定的,程序员难以控制。

          当使用post方式提交时,url编码方式会按照html头部的<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />设定的字符集进行编码。因此,以post方式提交时,编码处理就变得简单了。

          因此对程序员来说,如何处理get提交的编码问题,成为url的重点。

          在网上查阅了很多资料,还是没能找到一个特别有效的万全之策。下面是个人的一些处理想法:

             1.对于带有中文内容的表单提交,尽可能采用post的提交方式。

             2.对于网页中的链接url避免使用中文和不必要的特殊字符,这样就不需要进行url编码。

             3.方法三是参考了网上资料,当要用到get方式时,使用这几个js函数escape()encodeURI() encodeURIComponent()对参数进行编码,这几个函数式采用utf8的方式进行编码,

                   escape() 方法:    采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / +

                  encodeURI() 方法: 把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

                  encodeURIComponent(): 把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) 

           4.由于js传递数据都是使用utf-8编码,因此使用ajax的get,post时都是使用utf8编码,所以不需要再做过多处理了。

           5.服务器端解析url,如果参数编码不是网站设置的编码,那就使用php的函数iconv()对其转码。

           6. gb2312是双字节,可以顺利转为utf-8,但是utf-8是可变长字节,有时可能是3或4个字节,因此转为gb2312时,可能会丢失一些字节,因此个人建议使用utf8作为网站编码可能会更好些。

           下面的内容是关于php如何控制整个网站的编码及乱码问题:

           假设整个网站设定为utf-8编码:

           1.将php文件和html,js,css等的编码都切换成utf-8,这个是关于文件本身的编码方式的。js,css文件的头部可以加上一句  @charset "utf-8";php文件必须一无bom头的utf-8格式,因为如果有bom头的话。php的session将失效,因为php的session,开启之前,禁止任何输出。

           2.在网站入口文件php的开头,添加一句header("Content-Type: text/html;charset=utf-8");这个作用是返回给浏览器的报头;

           3.在html中头部中设置<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />,这句必须位于title之前,否则title可能乱码,这是高速浏览器该用何种编码读取html文件

           4.创建mysql数据库时,设置数据库编码为utf8_general_ci;

           5,操作数据库时,设定mysql_query('set names utf8');,注意这里是utf8,不要写成utf-8,至于为什么这样,我也不知道。

         

            以上是个人关于字符编码处理的一些看法,希望各位达人有更好的处理方式,可以给点建议!

 

            相关链接:http://www.cnblogs.com/simpman/archive/2013/04/07/3003571.html

                          http://www.cnblogs.com/simpman/archive/2013/06/08/3127184.html

 

          

 

         

        

        

         

转载于:https://www.cnblogs.com/webcheng/p/3863206.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值