照合がutf8_unicode_ci(テーブルとカラムの両方)であるMySQLテーブルに保存された、フランス語のテキスト(「é」などのアクセント付き文字を含む)をHTML5ページに出力したい。
HTMLページの文字セットはUTF-8(<meta charset = "utf-8" />)であり、PHPファイル自体は「BOMなしのUTF-8」としてエンコードされています(私はNotepad ++を使用しています) Windows)。PHP5を使用してデータベースをリクエストし、HTMLを生成します。
ただし、出力ページでは、特殊文字(「é」など)は文字化けして表示され、「�」に置き換えられます。
(phpMyAdminを介して)データベースを参照すると、同じアクセント記号付きの文字がうまく表示されます。
ここで何が欠けていますか?
(注:(Firefoxの「Web開発者」メニューから)ページのエンコードをISO-8859-1に変更すると、問題が解決します... PHPファイルに直接表示される特殊文字を除き、とにかく、UTF-8として機能しない理由を理解するのではなく、エンコーディングを変更するよりも、理由を理解した方がいいです。^^;)
以前に同じ問題を経験しました、そして私がしたことは次のとおりです
1)notepad ++(ほぼすべてのエンコーディングに適応可能)またはEclipseを使用して、必ずBOMなしでUTF-8で保存または開くにしてください。
2)エンコーディングをPHPヘッダーに、header('Content-type: text/html; charset=UTF-8');
を使用して設定します
3)my PHPファイルの先頭と末尾の余分なスペースをすべて削除します。
4)すべてのテーブルと列のエンコーディングをutf8mb4_general_ci
またはutf8mb4_unicode_ci
に設定します。 2つのエンコーディングの比較が利用可能です here
5)mysql接続文字セットをUTF-8に設定します(データベース接続にPDOを使用しています)
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
または、データをフェッチする前にSQLクエリを実行する
6)メタタグを使用する<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
7)フランス語に特定の言語コードを使用する<meta http-equiv="Content-language" content="fr" />
8)html要素のlang属性を目的の言語に変更します
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
過去のプロジェクトで日本語のキャラクターを扱っていたので、以前この問題を解決するのに本当に苦労したので、これをさらに更新します
9)一部のフォントはクライアントPCで使用できません。CSSに含めるには Google fonts を使用する必要があります
10)PHPソースファイルを?>
で終了しないでください
注:
しかし、上記のすべてが機能しない場合は、本当に表示したい文字セットに応じてエンコーディングを調整してください。私はすべてをSHIFT-JIS
に設定してすべての日本語文字を表示し、それが本当にうまく機能します。ただし、UFT-8
の使用を優先する必要があります
これは私のために働く
utf8_general_ci
_UTF-8 without BOM
_として保存します$mysqli->query('SET NAMES utf8');
を置きます< meta charset="utf-8" />
_を入れます完璧に動作します。
php.ini
default_charset
がUTF-8に設定されていない場合は、Content-type
を使用してデータを定義する必要があります。ファイルの上部に次のヘッダーを適用します。
header("Content-type: text/html; charset=utf-8");
それでもエンコードに問題がある場合、原因は次のいずれかである可能性があります。
default_encoding
パラメータを確認してください)<form>
文字セットの問題(utf-8として送信されることを確認してください)<html>
文字セットの問題(htmlファイルにenctypeが設定されていない場合)Content-encoding:
問題(Apacheが誤ったエンコードを送信する場合)。セットネームは私のために働いた。
私の問題は、編集ページの1つで、外国人の文字を含むフィールドが表示されないことでした。本番Webページでは問題はありませんでした。
私はあなたがすでに答えを持っているのを知っています。それは素晴らしいことです。しかし、奇妙なことに、これらの答えのどれも私の問題を解決しませんでした。同じ問題に遭遇する可能性のある他の人のために、私の答えを共有したいと思います。
多言語アプリケーションのフランス語アクセントに関しても、OPと同じ問題がありました。
しかし、AJAX呼び出しでセグメントとして(フランス語アクセント付き)データを渡す必要があったときに、この問題に初めて遭遇しました。
はい、UTF8で動作するようにデータベースを設定する必要があります。しかし、AJAX=呼び出しにはクエリ文字列が含まれていたため(私の場合、セグメントでは、CodeIgniterを使用しているため))、フランス語のテキストを単純にエンコードする必要がありました。
これをクライアント側で実行するには、データでJavaScriptのencodeURI()関数を使用します。
そして、PHPでそれを逆にするには、パラメーターとしてデータが受信されたurldecode($MyStr)
を使用します。
お役に立てれば。
下の行をウェブサイトのヘッダーに貼り付けます
header('Content-Type: text/html; charset=utf-8');
ページ(ファイル)は適切に表示されます。
良さそうな場合は ここ (SET_NAMES)の後のmysqlの動作を確認してください。