然而,问题并没有到此为止。使用DedeCMS构建的网站在登录后台时遇到了HTTP 500错误。经过一系列搜索和调试后,问题得到了解决。但紧接着又出现了新的问题:发表新文章时提示标题不能为空,而实际上标题已经填写了。这是因为在PHP 5.4及更高版本中,`htmlspecialchars`默认使用UTF-8编码进行检测,而中文字符在这种情况下可能无法被正确识别。为了解决这个问题,需要对DedeCMS中的代码进行修改,替换掉所有使用`htmlspecialchars`的地方。幸运的是,DedeCMS中只有十几处用到了这个函数,因此修改起来并不算太麻烦。
以下是一篇由技术大牛撰写的文章,详细解释了从旧版PHP升级到PHP 5.4后可能出现的问题以及解决方案:
在升级到PHP 5.4之后,`htmlspecialchars`函数的变化可能是最令人头疼的问题之一。虽然`htmlentities`也会受到影响,但对于大多数中文站点来说,`htmlspecialchars`更为常用,而`htmlentities`则很少用到。由于老外普遍认为网页应该是UTF-8编码的,因此使用GB2312或GBK编码的中文站点就遇到了麻烦。
具体表现如下:
$str = "9enjoy.com的php版本是5.2.10";
echo htmlspecialchars($str);
以下是`htmlspecialchars`函数的定义:
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )
国内许多开源程序在PHP 5.4环境下都会遇到类似的问题,甚至DISCUZ官方也建议用户不要升级到PHP 5.4。以下是几种解决方案:
1. **修改所有使用`htmlspecialchars`的地方**
- 将第二个参数 `$flags` 设置为 `ENT_COMPAT`,并指定编码为 `GB2312`:
htmlspecialchars($str, ENT_COMPAT, 'GB2312');
2. **通过设置默认字符集来简化参数**
在网页头部添加以下代码:
ini_set('default_charset', 'gbk');
htmlspecialchars($str, ENT_COMPAT, '');
创建一个简单的封装函数,方便后续调用:
function htmlout($str) {
return htmlspecialchars($str, ENT_COMPAT, 'ISO-8859-1');
}