PHP 如何编码解码
你肯定有过这样的经历:用手机给朋友发了一串带特殊符号的文字,对方复制到另一个软件里却变成了乱码;或者在网站上填了个带中文的表单,提交后后台显示的字符看不懂——这大多和“编码解码”有关,而在网页开发里,PHP就是处理这类问题的常用工具。
什么是编码?先搞懂“文字的翻译规则”
简单说,编码就是给每个文字、符号分配一个“专属编号”,就像给班里每个同学发学号,这样电脑才能识别存储。不同的“班级规则”(编码格式)会给同一个字分配不同的学号,比如中文“你”:用GBK编码是十六进制的0xC4E3,用UTF-8编码就变成了0xE4BDA0。

举个生活化的例子:你把“你好”写在便签上,用A4纸(GBK规则)排版,和用田字格本(UTF-8规则)写,字的间距、占格完全不一样,但都是“你好”这两个意思。如果把A4纸的内容直接塞到田字格本里,就会挤得乱码——这就是乱码的核心原因:编码规则不统一。
PHP里最常用的编码:先记牢UTF-8
现在网页统一用UTF-8,PHP也不例外,它能兼容全球大部分语言,避免乱码。比如你写个PHP变量存“你好”,只要页面设置了UTF-8,浏览器就能正常显示,不用额外处理。
但如果遇到需要转成其他格式(比如要存进旧数据库,只支持GBK),或者处理特殊字符,就得手动编码解码了。
基础编码解码:两个常用函数就搞定
PHP有两个专门处理URL或普通字符串的函数,日常用得最多,普通人记这两个就够:
urlencode:把内容转成浏览器能传的格式
你在浏览器地址栏输入带中文的关键词,比如“北京天气”,地址栏会自动变成一堆%加数字的字符,比如%E5%8C%97%E4%BA%AC%E5%A4%A9%E6%B0%94,这就是urlencode的效果。因为URL只能传英文字母、数字和少数符号,其他字符都得转成这种“安全格式”。
举个代码例子:
`php
// 要传给另一个页面的中文
$content = "北京天气";
// 编码后传过去
$encoded = urlencode($content);
// 输出结果:%E5%8C%97%E4%BA%AC%E5%A4%A9%E6%B0%94
echo $encoded;
`
就像把要寄的包裹先套上专用防水袋(编码),快递(浏览器)才能顺利送到。
urldecode:把编码后的内容转回来
收到编码后的内容,就得用urldecode还原,不然拿到的是一堆看不懂的%符号,没法用。比如另一个页面拿到上面的编码内容,解码后就能显示“北京天气”:
`php
// 接收到的编码内容
$encoded = $_GET['content'];
// 解码还原
$decoded = urldecode($encoded);
// 输出:北京天气
echo $decoded;
`
这就像收到包裹后,拆开防水袋(解码),拿到里面的实际物品。
补充:处理普通中文的编码
如果不是URL里的内容,只是普通中文转码,比如要把UTF-8的字转成GBK存到旧系统,用mb_convert_encoding函数就行,不用记复杂规则:
`php
// UTF-8的中文
$str = "你好世界";
// 转成GBK编码
$gbk_str = mb_convert_encoding($str, 'GBK', 'UTF-8');
// 再转回来就是UTF-8
$utf8_str = mb_convert_encoding($gbk_str, 'UTF-8', 'GBK');
`
就像把A4纸的内容复印到田字格本,需要按规则调整格式,这个函数就是帮你做格式转换的工具。
避坑提醒:别踩这两个小错误
很多新手容易犯两个错:一是编码和解码用的规则不统一,比如用urlencode编码,却用mb_convert_encoding解码,结果肯定乱码;二是没设置页面编码,PHP文件开头加个header("Content-Type: text/html; charset=utf-8");,确保浏览器和PHP用同一种规则,能少踩80%的乱码坑。
其实PHP的编码解码没那么复杂,核心就是“规则统一”,就像和朋友约好都说普通话,别一个说方言一个说英语,自然能顺畅交流。日常开发里只要用好那两个基础函数,处理大部分场景都足够了。