web-dev-qa-db-ja.com

PHP / MySQLの特殊文字

データベースに特殊文字を含む単語があります(スペイン語では、主にチルダのように)。データベースではすべてが保存され、PHPmyAdminで正しく表示されますが、(PHPを使用して)データを取得してブラウザーに表示すると、「?」のような奇妙な文字が表示されます。正方形で...私は一般的な修正が必要なので、毎回各文字をエスケープする必要はありません。また、PHPフォームからスペイン語の特殊文字を挿入できますデータベース...

HTMLは正しいです:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

すべてのテーブルとデータベースはutf8_spanishに設定されています

私が得るキャラクター:�

助言がありますか???

ありがとう!!!

19
Jonathan

HTML文字セットをISO-8859-1に変更して問題を修正しました!愚かな

4
Jonathan

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");

それが全体の理解を深めるのに役立つことを願っています。

31
Stefan Gehrig

問題 SET NAMES 'utf8'接続直後:

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
10
Quassnoi

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);
9
vartec

どこかで見つけたので、あまり考えずに全体を使っています。

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
4
user117001

あなたは単に行うことができます:

$link = mysql_connect("Host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
2
Marco Rosas

神聖ながらくた..これは私を狂気にさせていました。同じことをやろうとしていた。私はutf-8エンコードHTMLヘッダーを追加しました。mysqli_set_charset()は、数時間後に私を救いましたが、私はそれが今機能していることを嬉しく思います

特殊文字とアクセントをエンコードするために試す別の関数はhtmlentities()です

2
Omar

データベースにUTF8データが含まれていることを確認しますか?

1
soulmerge

HTMLでUnicodeエンコードをオンにします。

1
MrValdez

特殊文字を扱うときは、常に次のことに注意します。

  • データベース、テーブル、フィールドの文字セットはすべてutf8_general_ *またはutf8_unicode_ *に設定されています
  • エディターがPHP=適切な文字セットのファイルを保存することを確認します
  • Php.iniのdefault_charsetをUTF-8に設定or
  • Content-Type:text/htmlを送信します。 charset = UTF-8ヘッダー
  • METAタグの文字セットはUTF-8です(これはContent-Type HTTPヘッダーによってオーバーライドされます)
  • MySQLに接続するときに、次のクエリを発行します。
    • 名前の設定utf8
    • SET CHARACTER SET utf8
    • SET COLLATION_CONNECTION = "utf8_general_ci"/"utf8_general_ci"
1
Ionuț G. Stan

私にとってうまくいった答えは、Stefan Gehrigが投稿したものです。

$ mysqli-> set_charset( "utf8");

接続を定義し、問題を解決したら、その行を追加するだけです! :)

(コメントできないので回答を投稿しています...)。

1

興味深いことに、このコードは私にとってはうまくいきませんでした:

$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
0
goosseno

私の解決策は:上記のすべてを実行するだけでなく、メモ帳++で作業し、ファイルを次のように保存する必要があります:manuタブでエンコーディングに移動し、ファイルを保存します-> utf8でエンコード

0
ron