侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP也能干大事之PHP中的编码解码详解

php  /  管理员 发布于 7年前   233

写在前面

PHP也能干大事是我总结的PHP语法特性及相关函数类库的经典用法,并不一定是真正能实现四两拨千斤的功效,但是掌握这些方法,可以在你的工作和学习上有一些帮助,希望大家能集思广益,将《PHP也能干大事》丰富得更精彩!转载请注明出处(.net.cn)

二、前言

PHP是常见的脚本语言,主要是因为其简单易学,上手快,几乎50%以上的Web程序都有PHP的身影(不完全统计)。PHP为开发这提供了丰富的函数和API接口,这使得我们能够非常方便地使用其强大的内置函数及扩展,本文是《PHP也能干大事》系列的第一篇,主要总结PHP在编解码、进制转换方面的知识。

三、PHP编解码

1、ASCII编解码

ASCII(发音:英语发音:/ˈæski/ ASS-kee,American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以部分支持其他西欧语言,并等同于国际标准ISO/IEC 646。由于万维网使得ASCII广为通用,直到2007年12月,逐渐被Unicode取代。 https://zh.wikipedia.org/zh/ASCII

PHP基本函数内置了ASCII的编解码函数,这使得我们能轻松进行ASCII编解码。

int ord ( string $string ) //返回字符串 string 第一个字符的 ASCII 码值。
string chr ( int $ascii  ) //返回相对应于 ascii 所指定的单个字符。

复制代码 代码如下:

$str = 'Welcome to China';
function getNum($string){
    $needle = 0;
    $num = '';
    while (isset($string[$needle])) {
        $num .= $num==0?'':' ';
        $num .= ord($string[$needle]);
        $needle++;
    }
    return $num;
}
function getChar($num){
    $num_arr = explode(' ', $num);
    $string = '';
    foreach ($num_arr as $value) {
        $string .= chr($value);
    }
    return $string;
}
echo "字符转ASCII码\n";
echo getNum($str);
echo "\n";
echo "ASCII码字符\n";
echo getChar(getNum($str));
/* @OUTPUT
字符转ASCII码
87 101 108 99 111 109 101 32 116 111 32 67 104 105 110 97
ASCII码字符
Welcome to China
*/
 
?>

2、URL编解码

URL编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值,将它们以name/value参数编码作为URL的一部分或者分离地发给服务器。比如我们在访问网页中,会出现很多带有%的字符串,这就是URL编码。

URL编码一般采用UTF-8编码格式,所以建议采用UTF-8格式传递数据。正常意义的URL编码可以理解为ASCII码的16进制前加上%,无大小写区分。

复制代码 代码如下:

string urlencode(string $str)  //此函数便于将字符串编码并将其用于URL的请求部分,同时它还便于将变量传递给下一页。空格编码成 + 。
string urldecode(string $str)  //解码给出的已编码字符串中的任何 %XX,加号('+')被解码成一个空格字符。
string rawurlencode (string $str)   //根据 RFC 3986 编码指定的字符,空格转换成%20。
string rawurldecode (string $str)   //返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都将被替换成原义字符。 + 不被转换成空格。

两组函数用法一样,除了对于+和空格的转换处理上:rawurlencode将空格转为%20,不将+转为空格;urlencode则不一样。

复制代码 代码如下:

$str_arr = array(
    '',
    '',
    'PHP也能干大事',
    '!@#$%^&*()_+=-~`[]{}|\\;:\'"<>,./?'
    );
foreach ($str_arr as $key => $value) {
    echo $value,"\t->\t",urlencode($value),"\n";
}
/* @OUTPUT
  ->   
  ->    http%3A%2F%2F%2F
PHP也能干大事  ->    PHP%E4%B9%9F%E8%83%BD%E5%B9%B2%E5%A4%A7%E4%BA%8B
!@#$%^&*()_+=-~`[]{}|\;:'"<>,./?      ->    %21%40%23%24%25%5E%26%2A%28%29_%2B%3D-%7E%60%5B%5D%7B%7D%7C%5C%3B%3A%27%22%3C%3E%2C.%2F%3F
*/
?>

3、Base64编解码

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。使用的字符包括大小写字母各26个,加上10个数字,和加号「+」,斜杠「/」,一共64个字符,等号「=」用来作为后缀用途。完整的base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的4/3。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。 https://zh.wikipedia.org/zh/Base64

string base64_encode(string $data)  //使用 base64 对 data 进行编码。
string base64_decode (string $data [, bool $strict = false ])  //对 base64 编码的 data 进行解码。

案例:HTML页面中img标签可以在src属性中采用base64编码方式,来输出图片,这样可以减少HTTP请求次数。

复制代码 代码如下:

$string = file_get_content('3mc2.png');
echo '';
/* @OUTPUT
UEhQ5Lmf6IO95Yqe5aSn5LqL
*/
?>

4、HTML实体编解码

一些字符在HTML中是预留的,拥有特殊的含义,比如小于号「<」用于定义HTML标签的开始。如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入字符实体。字符实体有三部分:一个和号「&」 和一个实体名称(或者一个 「#」 和一个实体编号),以及一个分号「;」。http://www.ascii.cl/htmlcodes.htm

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = “UTF-8″ [, bool $double_encode = true ]]] )  //对包含如下HTML特殊字符进行HTML实体编码
1.'&' (ampersand) becomes ‘&'
2.'”‘ (double quote) becomes ‘"' when ENT_NOQUOTES is not set.
3.”‘” (single quote) becomes ‘'' (or ') only when ENT_QUOTES is set.
4.'<‘ (less than) becomes ‘<'
5.'>' (greater than) becomes ‘>'

string htmlspecialchars_decode (string $string [, int $flags = ENT_COMPAT | ENT_HTML401 ])  //此函数的作用和 htmlspecialchars() 刚好相反。它将特殊的HTML实体转换回普通字符。
还有功能相同的函数htmlentities/html_entity_decode,这对函数甚至对汉字都进行了HTML实体编码,而且会产生乱码,所以建议使用htmlspecialchars进行编解码。

案例:防止XSS跨站脚本攻击,需要对用户提交的数据进行HTML实体转换:

复制代码 代码如下:

$_POST['message'] = '测试留言字符\'">
  • 分类目录
  • 人生(杂谈)
  • 技术
  • linux
  • Java
  • php
  • 框架(架构)
  • 前端
  • ThinkPHP
  • 数据库
  • 微信(小程序)
  • Laravel
  • Redis
  • Docker
  • Go
  • swoole
  • Windows
  • Python
  • 苹果(mac/ios)
  • 相关文章
  • Laravel从Accel获得5700万美元A轮融资(0个评论)
  • PHP 8.4 Alpha 1现已发布!(0个评论)
  • 用Time Warden监控PHP中的代码处理时间(0个评论)
  • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
  • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
  • 近期文章
  • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
  • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
  • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
  • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
  • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
  • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
  • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
  • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
  • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
  • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
  • 近期评论
  • 122 在

    学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
  • 123 在

    Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
  • 原梓番博客 在

    在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
  • 博主 在

    佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
  • 1111 在

    佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
  • 2016-10
  • 2016-11
  • 2017-06
  • 2017-07
  • 2017-08
  • 2017-09
  • 2017-11
  • 2017-12
  • 2018-01
  • 2018-02
  • 2018-03
  • 2020-03
  • 2020-04
  • 2020-05
  • 2020-06
  • 2020-07
  • 2020-09
  • 2021-02
  • 2021-03
  • 2021-04
  • 2021-05
  • 2021-06
  • 2021-07
  • 2021-08
  • 2021-09
  • 2021-10
  • 2021-11
  • 2021-12
  • 2022-01
  • 2022-02
  • 2022-05
  • 2022-06
  • 2022-07
  • 2022-08
  • 2022-09
  • 2022-10
  • 2022-11
  • 2022-12
  • 2023-01
  • 2023-02
  • 2023-03
  • 2023-04
  • 2023-05
  • 2023-06
  • 2023-07
  • 2023-08
  • 2023-09
  • 2023-10
  • 2023-11
  • 2023-12
  • 2024-01
  • 2024-02
  • 2024-03
  • 2024-04
  • 2024-05
  • 2024-06
  • 2024-07
  • 2024-09
Top

Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

侯体宗的博客