在服务器升级的过程中,尤其是更换到全新的Windows Server 2008 R2 64位系统时,可能会遇到一些意想不到的问题。例如,在配置好环境后,IIS 7.5 的应用池频繁报错。经过一番排查,最终发现将PHP版本从32位升级到64位的PHP 5.5后,问题得以解决。这表明,在64位的Windows Server 2008环境下,搭配64位的PHP确实是更优的选择。

然而,问题并没有到此为止。使用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);
    
在GBK字符集下,上述代码的输出为空;而在UTF-8字符集下,输出正常。这是因为从PHP 5.4.0开始,`htmlspecialchars`函数的默认编码参数被改为UTF-8。

以下是`htmlspecialchars`函数的定义:

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )
    
在PHP 5.4之前,默认编码为ISO-8859-1,而从PHP 5.4开始,默认编码变为UTF-8。因此,对于中文字符,使用`htmlspecialchars`函数会导致输出为空白。

国内许多开源程序在PHP 5.4环境下都会遇到类似的问题,甚至DISCUZ官方也建议用户不要升级到PHP 5.4。以下是几种解决方案:

1. **修改所有使用`htmlspecialchars`的地方**
- 将第二个参数 `$flags` 设置为 `ENT_COMPAT`,并指定编码为 `GB2312`:

htmlspecialchars($str, ENT_COMPAT, 'GB2312');
    
- 如果需要使用GBK编码,可以改为:`htmlspecialchars($str, ENT_COMPAT, 'ISO-8859-1');`
2. **通过设置默认字符集来简化参数**
在网页头部添加以下代码:

ini_set('default_charset', 'gbk');
    
然后可以省略第三个参数:

htmlspecialchars($str, ENT_COMPAT, '');
    
3. **封装一个自定义函数**
创建一个简单的封装函数,方便后续调用:

function htmlout($str) {
    return htmlspecialchars($str, ENT_COMPAT, 'ISO-8859-1');
}
    
最后,最新版的DedeCMS已经解决了这一问题,只需将系统更新到最新版本即可避免这些麻烦。