PHP使用Embed包获取中文页面标题返回%编码乱码如何解决
问题原因
你看到的%开头的字符序列是URL百分号编码结果:embed包在解析部分站点标题时出现了优先级错误,把URL路径里编码后的中文字符串误判为页面标题返回,没有做解码处理。你遇到的%E4%BA%9E%E9%A6%AC%E9%81%9C%E5%85%AC%E5%8F%B8本质就是「亞馬遜公司」URL编码后的结果,不属于乱码。
解决方法
快速修复:手动解码返回值
PHP原生提供urldecode()函数专门处理这类百分号编码内容,拿到返回值后直接解码即可输出正常中文:
$rawTitle = $info->title; $correctTitle = urldecode($rawTitle);
为了避免误处理本身带%字符的正常标题,可以加一层合法性校验,只有解码后是合法UTF-8字符时才使用解码结果:
$title = $info->title; $decoded = urldecode($title); if (str_contains($title, '%') && mb_check_encoding($decoded, 'UTF-8')) { $title = $decoded; }
根治方案:调整解析逻辑
旧版本embed包的标题解析规则存在缺陷,会把URL路径片段作为高优先级标题来源,你可以按以下方式调整:
- 将依赖包升级到最新稳定版本
- 初始化解析实例时调整标题提取优先级,强制优先读取页面
<title>标签、OpenGraph元数据中的标题内容,把URL路径提取规则放到最低优先级,避免误取。
内容的提问来源于stack exchange,提问作者user7962781
相关产品推荐
相关产品推荐

