PHP也能干大事之PHP中的编码解码详解 |
本文标签:PHP,编码,解码 写在前面 PHP也能干大事是我总结的PHP语法特性及相关函数类库的经典用法,并不一定是真正能实现四两拨千斤的功效,但是掌握这些方法,可以在你的工作和学习上有一些帮助,希望大家能集思广益,将《PHP也能干大事》丰富得更精彩!转载请注明出处(jb51.net) 二、前言 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 码值 。 复制代码 代码如下: <?php $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则不一样 。 复制代码 代码如下: <?php $str_arr = array( www.jb51.net, http://www.jb51.net/, PHP也能干大事, !@#$%^&*()_+=-'`[]{}|\\;:\"<>,./? ); foreach ($str_arr as $key => $value) { echo $value,"\t->\t",urlencode($value),"\n"; } /* @OUTPUT www.jb51.net -> www.jb51.net http://www.jb51.net/ -> http%3A%2F%2Fwww.jb51.net%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 进行编码 。 案例:HTML页面中img标签可以在src属性中采用base64编码方式,来输出图片,这样可以减少HTTP请求次数 。 复制代码 代码如下: <?php $string = file_get_content(3mc2.png); echo <img src="data:image/png;base64,,base64_encode($string),">; /* @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实体编码 string htmlspecialchars_decode (string $string [, int $flags = ENT_COMPAT | ENT_HTML401 ]) //此函数的作用和 htmlspecialchars() 刚好相反 。它将特殊的HTML实体转换回普通字符 。 案例:防止XSS跨站脚本攻击,需要对用户提交的数据进行HTML实体转换: 复制代码 代码如下: <?php $_POST[message] = 测试留言字符\"><sCript src=http://www.jb51.net/hook.js>; if (empty($_POST[message])) { exit(Message is NULL); } $message = htmlspecialchars(trim($_POST[message])); echo $message; /* @OUTPUT 测试留言字符"><sCript src=http://www.jb51.net/hook.js> */ ?> 5、二进制、八进制、十进制、十六进制相互转换 进制之间的转换这里没什么好说的,总之都差不多,只要记住多少进制就是逢多少进一位,比如10进制就是9的下一位就是10,二进制、八进制、十六进制以此类推 。 string bin2hex (string $str) //返回 ASCII 字符串,为参数 str 的十六进制表示 。转换使用字节方式,高四位字节优先 。 6 、GBK、UTF-8字符编码转换 在写代码过程中,经常遇到编码问题而引发的乱码 。其实解决编码问题非常简单,只要使用一种编码即可,一般来说,采用万国码——UTF-8是最好的选择 。 这里说的编码是文字编码和文件存储的编码,当然,不得不提到系统的编码的差异性: 系统 编码 字符结尾 所以在处理特殊字符的时候要特别注意 。 常见的编码有GBK、UTF-8等等,函数使用上一般采用两种: string mb_convert_encoding (string $str , string $to_encoding [, mixed $from_encoding = mb_internal_encoding() ]) //将 string 类型 str 的字符编码从可选的 from_encoding 转换到 to_encoding 。 案例:Windows系统,架设了一个WAMP服务器,将如下脚本另存为一个UTF-8编码的php文件,即可通过浏览器查看无乱码的php目录里的文件;如果不是用mb_convert_encoding转码,将直接导致输出乱码(Windows作为服务器) 。 复制代码 代码如下: <?php function getDir($dir){ static $string = ; if(is_file($dir)){ $string.= $dir; }else{ $oDir = @opendir($dir); while($fileName = readdir($oDir)){ if($fileName!=. && $fileName!=..){ if(is_file($dir./.$fileName)){ $string.=$fileName."\n"; }elseif(is_dir($dir./.$fileName)){ $string.= $dir./.$fileName./."\n"; getDir($dir./.$fileName); } } } } return $string; } echo mb_convert_encoding( getDir(php),utf8, gbk ); ?> 四、总结 编码是数据的处理的基础,所以在PHP的编程开发过程中是相当重要的 。对于PHP的处理方法,应用在编程中还需要数量掌握,特别有些相似函数要如何区分 。转载请注明出处(jb51.net) |