web-dev-qa-db-ja.com

mySQLテーブルのアクセント付き文字

照合が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として機能しない理由を理解するのではなく、エンコーディングを変更するよりも、理由を理解した方がいいです。^^;)

13
s427

以前に同じ問題を経験しました、そして私がしたことは次のとおりです

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の使用を優先する必要があります

32
Netorica

これは私のために働く

  1. データベースを作成する_utf8_general_ci_
  2. ファイルをN ++で_UTF-8 without BOM_として保存します
  3. PHPファイルのデータベースへの接続の後に$mysqli->query('SET NAMES utf8');を置きます
  4. HTMLに_< meta charset="utf-8" />_を入れます

完璧に動作します。

17
Vucko

php.inidefault_charsetがUTF-8に設定されていない場合は、Content-typeを使用してデータを定義する必要があります。ファイルの上部に次のヘッダーを適用します。

header("Content-type: text/html; charset=utf-8");

それでもエンコードに問題がある場合、原因は次のいずれかである可能性があります。

  • データベースサーバーの文字セットの問題(サーバーのエンコーディングを確認してください)
  • データベースクライアントの文字セットの問題(接続のエンコーディングを確認してください)
  • データベーステーブルの文字セットの問題(テーブルのエンコーディングを確認してください)
  • pHPのデフォルトのエンコーディングの問題(parameters.iniのdefault_encodingパラメータを確認してください)
  • マルチバイトの設定ミス(parameters.iniのmb_stringパラメータを参照)
  • <form>文字セットの問題(utf-8として送信されることを確認してください)
  • <html>文字セットの問題(htmlファイルにenctypeが設定されていない場合)
  • Content-encoding:問題(Apacheが誤ったエンコードを送信する場合)。
2
Alain Tiemblo

セットネームは私のために働いた。

私の問題は、編集ページの1つで、外国人の文字を含むフィールドが表示されないことでした。本番Webページでは問題はありませんでした。

2
Paul R

私はあなたがすでに答えを持っているのを知っています。それは素晴らしいことです。しかし、奇妙なことに、これらの答えのどれも私の問題を解決しませんでした。同じ問題に遭遇する可能性のある他の人のために、私の答えを共有したいと思います。

多言語アプリケーションのフランス語アクセントに関しても、OPと同じ問題がありました。

しかし、AJAX呼び出しでセグメントとして(フランス語アクセント付き)データを渡す必要があったときに、この問題に初めて遭遇しました。

はい、UTF8で動作するようにデータベースを設定する必要があります。しかし、AJAX=呼び出しにはクエリ文字列が含まれていたため(私の場合、セグメントでは、CodeIgniterを使用しているため))、フランス語のテキストを単純にエンコードする必要がありました。

これをクライアント側で実行するには、データでJavaScriptのencodeURI()関数を使用します。

そして、PHPでそれを逆にするには、パラメーターとしてデータが受信されたurldecode($MyStr)を使用します。

お役に立てれば。

2
itsols
  1. (php)ファイルに完全なフランスの記号を入力します
  2. そのファイルをUTF-8として保存します
  3. 下の行をウェブサイトのヘッダーに貼り付けます

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

ページ(ファイル)は適切に表示されます。

良さそうな場合は ここ (SET_NAMES)の後のmysqlの動作を確認してください。

1
Xfile