我正在使用PHP 5.4,CakePHP 2.2.3开发一个应用程序。问题是,在我的本地服务器(XAMPP)中,不会发生此错误(PHP 5.4)。
但在我的服务器在线,它确实(PHP 5.3)。
错误是链接中的一个奇怪的字符:
此处:sgc/noticias/�avascript:void(0)
大多数奇怪的字符都是通过数据库提取的数据。
只有当我使用link
的{{1}}方法时才会发生这种情况。可以说,如果我回应一下:
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'));
我读到这个问题可能就像编码问题,但我几乎100%确定我的所有文件都是用UTF8编码的(没有BOM)。
看起来这是角色:%EF%BB%BF。
另外,查看错误日志会显示:
/sgc/pages/view
我不认为这个问题可能与CakePHP版本或CakePHP lib中的某个文件有关,因为我刚刚上传了一个新的CakePHP应用程序而没有修改任何东西(只是一个简单的CakePHP应用程序),一切都在我的在线服务器上工作正常
错误必须出现在我的某些文件中,而不是CakePHP。
我跟着this answer并使用Total Commander在我的项目中搜索UTF BOM文件。但结果是,只有图像返回搜索“EF BB BF”。
答案 0 :(得分:2)
"\xEF\xBB\xBF"
是一个UTF-8字节顺序标记,对此毫无疑问。
因为它始终位于link
参数的开头,所以这里有一些可能性:
/sgc/index
,/sgc/noticias
),您都会有一个迷失的尾随BOM。link()
助手本身正在将提供的输入编码为utf-8(例如'/pages/home'
)并错误地包含BOM。我会直接转到HTML::link()
代码并跟踪它,寻找对iconv
或mb_*
函数的调用。很可能这些库是在引擎盖下使用的,并且在某种程度上错误地配置为像编写文件时那样发出BOM。
答案 1 :(得分: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);
我在这里不知所措,但也许这些尾随可能会帮助某人追踪角色的原因。
答案 2 :(得分: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 controller
和index action
。
但是,如果我使用它(不设置plugin => ""
):
echo $this->Html->link('All users', array('controller' => 'users', 'action' => 'index'));
它指向我插件中的Users controller
。
我不想每次都声明它(plugin => ""
)所以在AppHelper::url
内我简单地说明了这个例程:如果plugin => ""
集合中没有$url
plugin
为空。
但这导致我使用HtmlHelper::url
或HtmlHelper::link
构建的所有网址中的这个奇怪字符。
我现在已将此功能更改为此内容:
public function url($url = null, $full = false) {
if (is_array($url)) {
if(!isset($url['plugin'])) {
$url['plugin'] = "";
}
}
return parent::url($url, $full);
}
一切正常。