5

yiiの文字エンコードに問題があります。新しいWebアプリを作成する場合:

 ./Yii-framework/framework/yiic webapp MyTest

次に、/ protected / views / layouts / main.phpに移動し、フッターをutf8文字を含むテキストに変更します(例:

<div id="footer">
        Cópyrîgth <br />
</div>

ページを更新すると、すべて問題ありません。良い!;)

次に、ユーザー名にutf8文字(たとえばádmin )を使用してログインしようとすると、次のようにクラッシュします。

Error 500

htmlspecialchars(): Invalid multibyte sequence in argument

だから私はyiiのユニコードについてこの記事をチェックしました

次に、 / protected / config / main.phpに移動し、最初に次の行を追加しました。

header('Content-Type: text/html; charset=utf-8');

同じログインを再試行すると機能しますが(クラッシュしません)、フッターが壊れて次のように表示されます。

C�pyr�ght

「Unicodeinyii」の記事で説明されているような他の組み合わせを試しましたが、どちらも同時に両方を機能させるものではありません。

この問題を解決するためのアイデアはありますか?

注:php.iniファイルに変更できません。

また、.htaccessファイルでAddDefaultCharset UTF-8オプションを試し、それを/ MyTest /のフォルダーに配置しました。これは、記事で正しいフォルダーが次のように参照されていることです

ありがとう

4

7 に答える 7

6

私は yii にはまったく詳しくありませんが、リテラル Unicode 文字をファイルに貼り付けたい場合は、テキスト エディタで utf8 などの Unicode エンコーディングを使用してファイルを保存する必要があります。BOM なしで utf8 を試してください。

私の経験では、エンコーディング設定を変更し、すでにエンコードされた文字が含まれていると、テキスト エディタの動作がおかしくなることがあります。新しいファイルで最初からやり直して、エンコーディングを変更してから、文字を貼り付けてください。

于 2012-06-11T22:12:04.383 に答える
4

まず、ó や î のような分音符号を持つ文字 (あなたの例から) は、自動的に「utf-8 文字」ではないことを理解する必要があります。基本的なシングルバイト ASCII 部分 (つまり、英語のアルファベット、数字、最も一般的な句読点、およびさらにいくつかの)。「問題のある文字」と呼ぶことはできますが、「utf-8 文字」とは言えません。

したがって、フッターを書いたとき、<div>UTF-8 エンコードされたものではありませんでした。エディターは、これらの文字をISO 8859-1またはその関連の 1 つなどのシングルバイト エンコーディングで保存しました。

ブラウザは通常、指定されていない場合、ページで使用されているエンコーディングを自動的に検出します。これが、エディタで書いたものを正確にブラウザで最初に見ることができた理由です。

次に、ユーザー名に「問題のある文字」を使用してログインしようとしました。ブラウザーはページをシングルバイト エンコーディングとして解釈したため、フォーム入力を同じ方法でエンコードし、シングルバイト エンコードしてサーバーに送り返しました。PHP コードは、この可能性を念頭に置いて作成されていなかったようですhtmlspecialchars()。これは"UTF-8"、デフォルトである の 3 番目のパラメータが正しく設定されていなかったためです (PHP 5.4.0 以降 - それ"ISO-8859-1"以前)。「問題のある文字」を含むシングルバイトでエンコードされた文字列が有効な UTF-8 文字列になることはほとんどないため (質問に対する私のコメントを参照してください。2 番目のコメントです)、 htmlspecialchars() はそれを拒否しました。

header('Content-Type: text/html; charset=utf-8');次に、ブラウザによる自動文字セット検出を無効にするを正しく追加しました。この時点で、フッターを含むファイル<div>が UTF-8 でエンコードされていないことが明らかになりました (「問題のある文字」の代わりに表示される疑問符の説明については、私のコメントをもう一度参照してください)。

あとは、編集者に UTF-8 でエンコードされたファイルを保存するよう説得するだけです。他の人が指摘したように、ファイルを別のエンコーディングで保存しても、すべてのエディターで機能するとは限りません。エディターのデフォルトのエンコーディングを UTF-8 に設定した後など、新しいファイルから開始することが解決策になる場合があります。

fileエンコーディングを確認するには、シェルでコマンドを使用できます。その出力は次のようになります

main.php: PHP script, UTF-8 Unicode text

またはod -tx1z、ファイル (おそらく| less) をダンプするコマンドを、対応する文字列を横に並べた 16 進バイトのシーケンスとして使用することもできます。ファイルがシングルバイトでエンコードされている場合、「問題のある文字」はシングルバイト >= 0x80 になります。UTF-8 でエンコードされている場合、それらは 2 バイトのシーケンス (その他は 3 バイト以上) で、すべて >= 0x80 ですが、「問題のない文字」は 0x80 未満の単一バイトのままです。

あなたが言及した記事はよく書かれているようです。それに従ってください。

ただし、すべてのページがHTTP ヘッダーで生成されている場合AddDefaultCharsetは、ファイルにディレクティブは必要ありません。これは、Apache ディレクティブの効果がまったく同じであるためです (また、PHP 内でエンコーディングを制御することをお勧めします)。.htaccessContent-Type: text/html; charset=utf-8

を追加する<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>と、ブラウザーに対して、上記の HTTP ヘッダーと同じ効果があります (http- equivに注意してください)。HTTP ヘッダーはよりクリーンですが、この追加のメタ タグは、ページがヘッダーの情報なしで保存された場合に役立ちます。

最も重要なことは、 UTF-8を恐れないことです。これはあなたの友達だからです!

(...しかし、あなたの報奨金を得た答えから、あなたは多くの人と同じように、文字エンコーディングを理解することはあなたにとって難しすぎると考え続けていることがわかります☹)

于 2013-03-21T22:27:33.053 に答える
2

まず、main.php ファイルのヘッダー呼び出しを削除する必要があります。これにより、将来問題が発生する可能性があります。

次に、rambo coder が提案したことを実行し、エディターでファイルが UTF8 として保存されていることを確認します。

于 2012-06-13T13:15:22.433 に答える
1

問題についてはhtmlspecialchars、この回答を確認してください:https ://stackoverflow.com/a/3803972/133408

の3番目のパラメータとしてエンコーディングを指定する必要がありますhtmlspecialchars

于 2013-03-20T16:31:05.383 に答える
1

Yii は実際には Unicode に問題を抱えていないため、上記の解決策は正しい方法のようですが、Html ページのメタ タグ内の文字セットが utf-8 に設定され、プレーンな html を記述する代わりに、次のような追加のチェックを実行することもできます。 yii がエンコーディングを処理できるように、Chtml::encode(Copyright) を使用できます。ユーザー名の部分については、データベースのデフォルトの文字セットも utf8 に設定されていることを確認してください。

于 2013-03-15T20:31:18.060 に答える
0

これを回避する最善の方法は、http: //www.utexas.edu/learn/html/spchar.htmlを使用することです。この場合、Cópyrîghtは次のように表示されます。C&#243;pyr&#238;ght

また、HTML<meta charset="utf-8">を追加して、ブラウザーが動作していることを確認します。

于 2013-03-21T05:58:04.993 に答える
0

私もこの問題を抱えていました。特に、db から utf テキストを表示しようとしたときに発生しました。mysql のすべての照合順序と型を utf8-bin に変更しましたが、それでも気に入りません...それから、すべてのレイアウトとビューをメタ タグなどで変更しようとしました...地獄、日本語の Web サイトのソース コードも調べましたYii And UTF8 Display, UTF8はmysqliで動作するが、yiiバックエンドでは動作しないことがわかりました .コンポーネントの下の構成ファイルのphp.. f

于 2014-03-07T09:28:54.703 に答える