You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP DOMDocument日文字符编码问题及解决方案咨询

解决DOMDocument处理UTF-8日文文件名乱码问题

你遇到的问题核心在于DOMDocument的loadHTML方法默认会把输入内容当作ISO-8859-1(Latin-1)编码解析,哪怕你提前设置了$dom->encoding = 'utf-8'也没用——这个属性的优先级低于loadHTML的默认行为,导致UTF-8编码的日文字符被错误转码成乱码。

下面是针对你的代码的具体修改方案,能完美兼容UTF-8字符(包括日文):

关键修改点

  1. 在调用loadHTML前,给HTML内容添加XML UTF-8声明,强制DOMDocument以UTF-8编码解析内容;
  2. 启用libxml错误抑制(避免HTML解析时的警告干扰),同时确保编码处理正确;
  3. 替换原有的字符串替换逻辑为直接操作DOM元素,避免编码相关的字符串处理漏洞。

修改后的完整代码

$dom = new DOMDocument();
// 启用libxml错误抑制,避免HTML解析时的警告(可选但推荐)
libxml_use_internal_errors(true);
// 给内容添加XML UTF-8声明,强制DOMDocument用UTF-8解析
$dom->loadHTML('<?xml encoding="UTF-8">' . $content);
libxml_clear_errors();

$images = $dom->getElementsByTagName('img');
foreach ($images as $image) {
    if( $image->hasAttribute('srcset') ) continue;
    $initImgSrc = $image->getAttribute('src');
    echo $initImgSrc;
    if (!preg_match('/[_-]\d+x\d+(?=\.[a-z]{3,4}$)/', $initImgSrc)) continue;
    $newImgSrc = preg_replace('/[_-]\d+x\d+(?=\.[a-z]{3,4}$)/', '', $initImgSrc);
    if (strpos($newImgSrc, '/') === 0) {
        $newImgPath = str_replace( '/wp-content', ABSPATH . 'wp-content', $newImgSrc);
    } else {
        $newImgPath = str_replace( get_home_url(), ABSPATH, $newImgSrc);
    }
    if (!file_exists($newImgPath)) continue;
    echo 'yes';
    // 直接操作DOM元素添加srcset,替代原字符串替换逻辑(更可靠)
    $image->setAttribute('srcset', "{$initImgSrc} 1x, {$newImgSrc} 2x");
    // 重新生成修改后的HTML内容
    $content = $dom->saveHTML();
}
return $content;

优化说明

  • 添加XML UTF-8声明后,DOMDocument会强制以UTF-8编码解析内容,日文字符不会再被转码成乱码;
  • 用setAttribute直接操作DOM元素替代字符串替换,避免了HTML格式差异(比如属性空格、引号类型)导致的替换失败问题,同时彻底规避编码相关的字符串处理风险;
  • 启用libxml错误抑制是为了避免DOMDocument解析不规范HTML时抛出的警告影响程序运行,最后清理错误缓存保证环境干净。

这样修改后,DOMDocument就能正确识别并保留UTF-8编码的日文字符,后续的文件检测和属性修改逻辑都能正常工作了。

内容的提问来源于stack exchange,提问作者James Cartwright

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:16:43