データベースに特殊文字を含む単語があります(スペイン語では、主にチルダのように)。データベースではすべてが保存され、PHPmyAdminで正しく表示されますが、(PHPを使用して)データを取得してブラウザーに表示すると、「?」のような奇妙な文字が表示されます。正方形で...私は一般的な修正が必要なので、毎回各文字をエスケープする必要はありません。また、PHPフォームからスペイン語の特殊文字を挿入できますデータベース...
HTMLは正しいです:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
すべてのテーブルとデータベースはutf8_spanishに設定されています
私が得るキャラクター:�
助言がありますか???
ありがとう!!!
HTML文字セットをISO-8859-1に変更して問題を修正しました!愚かな
vartec によって提案されたソリューションの詳細をいくつか提供したいと思います。これは(MySQLのインストールに応じて)問題に対する最も正しいソリューションです。最初に、MySQLの文字セット/エンコーディングの問題は、MySQLマニュアル 第9.1章「文字セットのサポート」 で広くカバーされているやや複雑な問題です。あなたの場合は特に 9.1.4。「接続文字セットと照合順序」 が最も関連性があります。
簡潔に言うと、MySQLは、クライアントアプリケーション(PHPスクリプト)であるデータベースの観点から話す)が内部からすべての文字列データをトランスコードすることを期待しているため、どの文字セット/エンコーディングを知っている必要があります。サーバー、データベース、テーブル、または列レベルで定義された文字セット/エンコーディングを接続文字セット/エンコーディングに組み込みます。クライアント側でUTF-8を使用しているため、MySQLにUTF-8を使用するように指示する必要があります。これはMySQLコマンドSET NAMES 'utf8'
これは、接続を開くときに最初のクエリとして送信する必要があります。インストールとPHPスクリプトで使用するMySQLクライアントライブラリに応じて、これは接続ごとに自動的に実行できます。
PDOを使用する場合は、構成パラメーターを設定するだけです。
$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
Mysqliを使用してクライアントの文字セット/エンコーディングを変更することはさらに簡単です。
$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");
それが全体の理解を深めるのに役立つことを願っています。
問題 SET NAMES 'utf8'
接続直後:
$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
MySQLに自動的に翻訳させる
$conn = mysql_connect('Host', 'user', 'password');
mysql_set_charset('utf8',$conn);
http://es.php.net/manual/en/function.mysql-set-charset.php
編集:私が収集したコメントから、これは実際にはlatin1でエンコードされているので、
mysql_set_charset('latin1_spanish_ci',$conn);
どこかで見つけたので、あまり考えずに全体を使っています。
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
あなたは単に行うことができます:
$link = mysql_connect("Host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
神聖ながらくた..これは私を狂気にさせていました。同じことをやろうとしていた。私はutf-8エンコードHTMLヘッダーを追加しました。mysqli_set_charset()は、数時間後に私を救いましたが、私はそれが今機能していることを嬉しく思います
特殊文字とアクセントをエンコードするために試す別の関数はhtmlentities()です
データベースにUTF8データが含まれていることを確認しますか?
HTMLでUnicodeエンコードをオンにします。
特殊文字を扱うときは、常に次のことに注意します。
私にとってうまくいった答えは、Stefan Gehrigが投稿したものです。
$ mysqli-> set_charset( "utf8");
接続を定義し、問題を解決したら、その行を追加するだけです! :)
(コメントできないので回答を投稿しています...)。
興味深いことに、このコードは私にとってはうまくいきませんでした:
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
mysqli_set_charset($link, "utf8");
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows latin1
ただし、条件内で文字セットを設定すると機能します。
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s\n", mysqli_error($link));
exit();
} else {
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows utf8
}
私のセットアップ:
$ rpm -qa|grep -E "php|maria"
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
mariadb-libs-5.5.56-2.el7.x86_64
php-pdo-5.4.16-45.el7.x86_64
php-cli-5.4.16-45.el7.x86_64
php-5.4.16-45.el7.x86_64
php-common-5.4.16-45.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64
私の解決策は:上記のすべてを実行するだけでなく、メモ帳++で作業し、ファイルを次のように保存する必要があります:manuタブでエンコーディングに移動し、ファイルを保存します-> utf8でエンコード