0

我正在使用 PHP 5.4、CakePHP 2.2.3 开发一个应用程序。问题是,在我的本地服务器(XAMPP)中,这个错误不会发生(PHP 5.4)。

但在我的在线服务器中,它确实如此(PHP 5.3)。

错误是链接中的那个奇怪的小字符:

在此处输入图像描述

这里:sgc/noticias/�avascript:void(0)

大多数奇怪的字符是通过数据库获取的数据。

这仅在我link使用HtmlHelper. 可以说,如果我回应这个:

echo $this->Html->link('Click me', '/pages/home', array('class' => 'button', 'target' => '_blank'));

我明白了:

在此处输入图像描述

如图所示:/sgc/index/�pages/home

如果我回应这个:

<a href="/sgc/index/pages/home" >Click me</a>

我明白了:/sgc/index/pages/home

如果我回应这个:

echo $this->Html->link('Click me',array('controller'=>'pages', 'action' => 'view'), array('class' => 'button', 'target' => '_blank'));

我明白了:/sgc/pages/view

我读到这个问题可能类似于编码问题,但我几乎 100% 确定我的所有文件都以 UTF8 编码(没有 BOM)。

看起来这是字符:%EF%BB%BF。

此外,查看错误日志会显示:

2012-11-21 15:37:05 Error: [MissingActionException] Action IndexController::�index() could not be found.

我不认为这个问题可能与 CakePHP 版本或 CakePHP lib 中的某个文件有关,因为我刚刚上传了一个新的 CakePHP 应用程序而没有修改任何东西(只是一个简单的 CakePHP 应用程序),并且在我的在线服务器上一切正常。

错误必须在我的某些文件中,而不是在 CakePHP 中。

更新

我遵循这个答案并使用 Total Commander 在我的项目中搜索 UTF BOM 文件。但结果是,只有图像在搜索“EF BB BF”时返回。

4

3 回答 3

2

"\xEF\xBB\xBF"是一个 UTF-8 字节顺序标记,毫无疑问。

因为它总是在link争论的开始,所以我想到了一些可能性:

  1. 无论您在何处配置了基本路径(例如/sgc/index/sgc/noticias),您都有一个杂散的尾随 BOM。
  2. link()助手本身将提供的输入编码为 utf-8(例如,)'/pages/home'并错误地包含 BOM。

我会直接进入HTML::link()代码并跟踪它,寻找对iconv函数mb_*的调用。这些库很可能是在幕后使用的,并且以某种方式错误地配置为发出 BOM,就像您在编写文件时一样。

于 2012-11-21T18:22:57.130 回答
1

冲突的编码似乎确实是一个问题。检查app/config/core.php中是否有以下内容,它应该存在,因为它是默认值:

Configure::write('App.encoding', 'UTF-8');

然后在您的视图中指定charset如下<head>

<head>
    <?php echo $html->charset(); ?>
</head>

编辑

link()方法URL在生成链接之前对其接收到的内容进行一些处理:

$url = $this->url($url); // Line 335

然后该url()方法使用Router::url()静态方法和全局h()函数:

return h(Router::url($url, $full));

Router::url()方法似乎没有做任何与编码相关的事情,该h()函数只使用 PHP 的htmlspecialchars()

return htmlspecialchars($text, ENT_QUOTES, ($charset) ? $charset : $defaultCharset, $double);

我在这里不知所措,但也许这些尾随可能有助于某人追查角色的原因。

于 2012-11-21T18:00:34.247 回答
0

我才发现问题!非常感谢你们帮助我思考。

直截了当,给我那些奇怪字符的代码是这样的:

public function url($url = null, $full = false) {

    if(!isset($url['plugin'])) {
        $url['plugin'] = null;
    }

    return parent::url($url, $full);
}

那是在课堂AppHelper上。但为什么?

我的应用程序分为模块,这意味着一个模块=插件。我的应用程序中有很多插件。有时,当我在插件页面(如新闻或博客)中时,我想链接到一个控制器,该控制器是应用程序的一部分而不是插件的一部分,我总是必须设置plugin => ""以便 CakePHP 知道我想要一个不属于插件的控制器;

示例:当我使用HtmlHelper::link或什至HtmlHelper::url

echo $this->Html->link('All users', array('plugin' => '', 'controller' => 'users', 'action' => 'index'));

这将回显正确的链接,该链接将指向Users controllerand index action

但是,如果我使用这个(没有设置plugin => ""):

echo $this->Html->link('All users', array('controller' => 'users', 'action' => 'index'));

它指向我的Users controller插件内部。

我不想每次都plugin => ""声明它(AppHelper::urlplugin => ""$urlplugin

但这导致我在使用HtmlHelper::urlor构造的所有 URLS 中出现了这个奇怪的字符HtmlHelper::link

我现在将此功能更改为:

public function url($url = null, $full = false) {

    if (is_array($url)) {
        if(!isset($url['plugin'])) {
            $url['plugin'] = "";
        }    
    }
    return parent::url($url, $full);
}

一切正常。

于 2012-11-21T20:19:59.737 回答