2012-06-11 10 views
5

yiiのcharエンコーディングに問題があります。 私は、新しいWebアプリケーションを作成した場合:yiiのutf8文字とhtmlspecialcharsのエラー

./Yii-framework/framework/yiic webapp MyTest 

を次にutf8文字とテキストにフッターを/protected/views/layouts/main.phpし、変更に行く、例えば

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

更新ページとすべてが大丈夫です。ニース! ;)

そして、私は、ユーザー名でUTF8文字を使用してログインしようとすると、例えば管理、それは言ってクラッシュ:だから私はこの記事におよそunicode in yii

を確認

Error 500 

htmlspecialchars(): Invalid multibyte sequence in argument 

をし、その後、私は /protected/config/main.php に行って、起動時にこの行を追加:

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

再試行同じログインが再びそれが動作(クラッシュしない)が、今フッタが壊れと示している:

C�pyr�ght 

「ユニコードのYiiの」記事が、のどれで説明したように、私は他の組み合わせを試してみましたそれらは同時に両方のものを動作させます。

この問題を解決するための方法はありますか?

注:php.iniファイルに変更することはできません。

私も.htaccessファイルではAddDefaultCharset UTF-8オプションを試してみましたが、/ MyTestというのフォルダに入れて/として記事に言及正しいフォルダということである:あなたのDocumentRootの

おかげ

+0

私は同じ問題を抱えています。あなたは解決策を見つけましたか? – coderama

+0

これらの疑問符は、無効なUTF-8バイトシーケンスの結果です。ほとんどの場合、たとえば[ISO 8859-1](http://en.wikipedia.org/wiki/ISO/IEC_8859-1)などのテキストを1バイトのエンコーディングで保存したエディタを使用していた可能性があります。 ASCIIの拡張であるすべてのシングルバイトエンコーディングでは、拡張部分のバイト値は128以上です。UTF-8のすべてのシングルバイト文字は<128、すべてのマルチバイト文字はバイト> = 128で構成されます。分音記号付きのISO 8859-x文字は疑問符になります。これらは、おそらくUTF-8にはなりません。 –

答えて

6

私は、あなたがファイルにリテラルUnicode文字を貼り付けたい場合、あなたはテキストエディタはUnicodeのエンコーディングを使用してファイルを保存していることを確認する必要があり、全くのYiiに慣れていないんだけど、 utf8のようなものです。 BOMなしでutf8を試してください。

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

+0

「utf8などのUnicodeエンコーディングを使用する」は良いアドバイスではなく、「UTF-8 Unicodeエンコーディングを使用する」必要があります。他の[Unicode](http://en.wikipedia.org/wiki/Unicode)エンコーディングはウェブにはお勧めできません。 UTF-8では[BOM](バイトオーダーマーク)(バイトオーダーマーク)はほとんど意味をなさないが、ほとんどのエディターはこのオプションをUTF-8についても考慮しない)。 –

+0

私は自分自身を修正する必要があります。明らかに、** BOMなしでUTF-8でエンコードされたファイルを保存できないエディタの例もあります:Microsoftのメモ帳。 IDEのエディタを使用したくないWindowsユーザは、メモ帳++を使用することができます。これはフリーで使いやすいものです。 –

2

まず、main.phpファイルのヘッダコールを削除すると、将来問題が発生する可能性があります。

第2に、ramboコーダーが示唆したことを行い、ファイルがエディターにUTF8として保存されていることを確認します。

+0

ヘッダコールが将来どのように問題を引き起こす可能性がありますか? –

1

上記の解決方法は、Yiiが実際にユニコードに問題がないので、あなたのHtmlページのメタタグ内の文字セットのようないくつかの追加チェックを実行することができますが、utf-8ではなく普通のHTMLを書くと、yiiがエンコーディングを処理するようにChtml :: encode(Copyright)を使うことができます。 username部分については、データベースのDefault Charsetもutf8に設定されていることを確認してください。htmlspecialchars問題については

0

の3番目のパラメータとしてエンコードを指定する必要があります - あなたのケースで C ó PYR î GHTだろうC&#243;pyr&#238;ght

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

+1

適切なセットアップutfシステムでは、文字をhtmlエンティティにエンコードする必要はありません。 –

+0

技術的に正しいわけではありませんが、これは私が知ってうれしいオプションですので、downvoteに値するものではありません。 – coderama

+0

"最良の方法AROUND this"は、すべてのUTF8合併症を回避することを意味します。マルチバイト文字で作業しているときに、別のフォントセットを持つユーザーエージェント(ブラウザ)に表示されるseeを見ると真です。 –

3

最初に、óまたはîのような発音記号を持つ文字は、自動的に「utf-8文字」ではないことを理解する必要があります。これは、基本的な1バイトのASCII部分(英字、数字、最も一般的な句読点)を持つ文字セットであっても、異なる文字セット内に異なるエンコーディング(存在する場合)を持つ文字です。さらにいくつかの)。あなたはそれを "問題のあるキャラクター"と呼ぶことができますが、 "utf-8キャラクター"ではありません。

したがって、フッター<div>を書き込んだときに、UTF-8でエンコードされていませんでした。あなたのエディタは、ISO 8859-1またはその1つの親戚のような1バイトのエンコーディングでそれらの文字を保存しました。

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

次に、ユーザー名に「問題のある文字」でログインしようとしました。ブラウザはあなたのページを1バイトのエンコーディングとして解釈していました。このため、フォーム入力を同じ方法でエンコードし、1バイトエンコードでサーバーに戻しました。 PHPコードは、htmlspecialchars()の第3パラメータ(デフォルトでは"UTF-8")を正しく設定していなかったため、この可能性を念頭に置いて作成されていませんでした(PHP 5.4.0から - それ以前は"ISO-8859-1"でした)。 "問題のある文字"を含む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)を使用することができます。ファイルがシングルバイトでエンコードされている場合、「問題のある文字」はシングルバイト> = 0x80になります。 UTF-8でエンコードされている場合、2バイト(3バイト以上)のシーケンスとなります。すべて> 0x80ですが、「問題のない文字」は1バイトのままです。< 0x80。

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

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

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

これはあなたの友人ですので、最も重要なことに、UTF-8を恐れることはありません!

(...しかし、あなたの恵みを得た答えから、私はあなたが、多くの人々のように、☹文字エンコーディングを理解することが、あなたのためにあまりにも難しいことだと思うし続けることを参照)

+0

+10包括的な答えと悲しい顔の最後にはutfです –

0

私もこの問題を抱えていました - 具体的に私はdbからutfテキストを表示しようとしていました。 mysqlのすべてのcolationsとtypesをutf8-binに変更しましたが、まだ愛はありません...そして、私はメタタグなどのレイアウトとビューをすべてchnageしようとしました...地獄、コードを書いて、そのものを貼り付けました...何もしていません_ ... ...私はこの投稿に出会いました:Yii And UTF8 Display, UTF8 works with mysqli but not yii backendあなたは設定ファイル内のmain.phpの設定をコンポーネントの下でtweekする必要があります。f

関連する問題