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

この問題はエンコーディングの問題のようなものである可能性があることを読みましたが、すべてのファイルが UTF8 (BOM なし) でエンコードされていることはほぼ 100% 確信しています。

%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()を探します。ほとんどの場合、これらのライブラリは内部で使用されており、ファイルの書き込み時と同じようにBOMを発行するように誤って構成されています。iconvmb_*

于 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 controllerこれは、とを指す正しいリンクをエコーしindex action​​ます。

しかし、これを(設定せずにplugin => "")使用すると:

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

Users controllerプラグインの内部を指し示していました。

私は毎回それを宣言したくなかったplugin => ""ので()、AppHelper::url私は単純にこのルーチンを入れました:nullplugin => ""$url設定されているものがない場合。plugin

HtmlHelper::urlしかし、これにより、またはを使用して作成されたすべての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);
}

そして、すべて正常に動作しています。

于 2012-11-21T20:19:59.737 に答える