不一致の文字エンコード
-
02-10-2019 - |
質問
私のスクリプトは間違いなくUTF-8に保存されています。 PDOをインスタンス化しています "{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8"
. 。私のテーブルはINNODBを使用し、UTF8_GENERAL_CIを使用して照合されます。私のページはのいずれかで送信されます Content-Type: text/html; charset=UTF-8
ヘッダーまたは <meta>
同等。
PDOを使用して、HTTP入力またはソースコードにリテラルの文字列から発信される€キャラクターを保存する場合、私は残されています c3 a2 e2 80 9a c2 ac
MySQL Workbench 5.2によると。これをデータベースから取得し、ページに表示すると正常に機能します。しかし、phpmyadminとworkbenchではわかります €
.
これら2つのツールを使用して€を保存するとき、私は e2 82 ac
, 、これは明らかに正しいUTF-8表現ですが、PHPでこれを取得して出力しようとすると、表示されます。
私の質問は、この矛盾がどこから発生するのか、そして私のウェブページとデータベースツールを完璧に機能させることは可能ですか?
解決
DSNのcharsetディレクティブは、実際にMSSQLに適用されます。私は単に実行する必要がありました SET NAMES
. 。申し訳ありません。
私はそれを達成しました:
parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
$this->user, $this->password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
他のヒント
簡単には、€をSuperfixのHTMLエンティティ€に変換します(ただし、他の特別文献で問題が発生する場合があります)
問題の反対側(およびより具体的に)はmysqlをチェックすることです Character_set_server そして最も一般的な原因 Character_set_client -Seealso: 接続充電器
また、Meta equivが違いをもたらさないことに注意することが重要です。 いつも ヘッダーを設定します( 'content-type:...)
HTMLページは正しいので、データベースに正しいデータを保存しているようです。
€
Windows-1252と誤って解釈されるユーロ記号のUTF-8エンコードです。 Windowsツールは、データベースエンコードの代わりに「ANSI」エンコードを使用しているようです。