zoukankan      html  css  js  c++  java
  • PHP 与 javascript URL编码后相互交互的问题

      在PHP中URL编码函数基本有两个:

      urlencode():返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。

      rawurlencode():返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。

      基本上两个函数的用法相似(没有进一步阅读源码比较),只是处理空格的方式不同:  

    <?php
    echo '<pre>';
    $a = ' ';
    echo urlencode($a)."\n".rawurlencode($a);
    output:
    + %20

    echo var_dump(urldecode('%20'));
    echo var_dump(rawurldecode('%20'));
    echo var_dump(urldecode('+'));
    echo var_dump(rawurldecode('+'));
    输出:
    string
     ' ' (length=1)
    
    string
     ' ' (length=1)
    
    string
     ' ' (length=1)
    
    string
     '+' (length=1)
    

       但是奇怪的是,urldecode可以将"%20" 解码为空格,rawurldecode 对+ 的解码却没有什么效果。基本上可以认为只有出现%20 就是rawurlencode 编码。  

      base64_encode() returns 使用 base64 对 data 进行编码。设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,例如电子邮件的主体。 数据要比原始数据多占用 33% 左右的空间。

       $str = 'This is an encoded string';
      echo
    base64_encode($str);

      VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw==

      铭记看到这样格式的编码,脑中蹦出的是base64.

      测试:

      $a = 'testid=qa&user=zoro';

      echo urlencode($a)."\n".rawurlencode($a)."\n".base64_encode($a);

      testid%3Dqa%26user%3Dzoro

      testid%3Dqa%26user%3Dzoro

      dGVzdGlkPXFhJnVzZXI9em9ybw==

      在javascript 中,常用的url编码函数有:

      >>> console.log(escape('testid=qa&user=zoro'))

      testid%3Dqa%26user%3Dzoro

      >>> console.log(encodeURIComponent('testid=qa&user=zoro'))

      testid%3Dqa%26user%3Dzoro

      >>> console.log(encodeURI('testid=qa&user=zoro'))

      testid=qa&user=zoro

      测试可以看出,用ANSI编码的都可以直接相互转换使用。

      接着:

      $a = 'testid=测试&user=索罗';
      echo urlencode($a)."\n".rawurlencode($a)."\n".base64_encode($a);

      testid%3D%B2%E2%CA%D4%26user%3D%CB%F7%C2%DE

      testid%3D%B2%E2%CA%D4%26user%3D%CB%F7%C2%DE

      dGVzdGlkPbLiytQmdXNlcj3L98Le

      javascript:

      >>> console.log(escape('testid=测试&user=索罗'))

      testid%3D%u6D4B%u8BD5%26user%3D%u7D22%u7F57

      >>> console.log(encodeURIComponent('testid=测试&user=索罗'))

      testid%3D%E6%B5%8B%E8%AF%95%26user%3D%E7%B4%A2%E7%BD%97

      >>> console.log(encodeURI('testid=测试&user=索罗'))

      testid=%E6%B5%8B%E8%AF%95&user=%E7%B4%A2%E7%BD%97

      换成GBK编码,没有一组PHP和javascript之间交互。因为,JS的函数不论页面采用什么编码,都会自动转成 utf-8 再进行转码。

      解决办法,统一转码为UTF-8

      将PHP代码转换为UTF-8之后: 

    testid%3D%E6%B5%8B%E8%AF%95%26user%3D%E7%B4%A2%E7%BD%97
    testid%3D%E6%B5%8B%E8%AF%95%26user%3D%E7%B4%A2%E7%BD%97
    dGVzdGlkPea1i+ivlSZ1c2VyPee0oue9lw==
      这样一来就可以用encodeURIComponent和PHP的函数来交互。
  • 相关阅读:
    python并发编程之gevent协程(四)
    python并发编程之asyncio协程(三)
    python并发编程之multiprocessing进程(二)
    python并发编程之threading线程(一)
    python设计模式之内置装饰器使用(四)
    python设计模式之装饰器详解(三)
    python设计模式之迭代器与生成器详解(五)
    EF code First数据迁移学习笔记
    15.02.13-代码小技巧
    Route学习笔记之Area的Route注册
  • 原文地址:https://www.cnblogs.com/zoro/p/2249033.html
Copyright © 2011-2022 走看看