最初に、óまたはîのような発音記号を持つ文字は、自動的に「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を恐れることはありません!
(...しかし、あなたの恵みを得た答えから、私はあなたが、多くの人々のように、☹文字エンコーディングを理解することが、あなたのためにあまりにも難しいことだと思うし続けることを参照)
私は同じ問題を抱えています。あなたは解決策を見つけましたか? – coderama
これらの疑問符は、無効な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にはなりません。 –