27

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

HTMLは正しいです:

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

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

私が手に入れたキャラクター: �</p>

助言がありますか???

ありがとう!!!

4

15 に答える 15

35

問題に対する最も正しい解決策であるvartecによって提案された解決策 (MySQL のインストールによって異なります) について、もう少し詳しく説明したいと思います。まず、MySQL の文字セット/エンコーディングの問題は、MySQL マニュアルの第 9.1 章「文字セットのサポート」で詳しく説明されているやや複雑な問題です。あなたの場合、特に9.1.4. 「接続文字セットと照合順序」が最も関連性があります。

簡単に言うと、MySQL は、サーバーで定義された内部文字セット/エンコーディングからすべての文字列データをトランスコードするため、クライアント アプリケーション (PHP スクリプトであるデータベース persoective から話します) が期待している文字セット/エンコーディングを認識している必要があります。データベース、テーブル、または列レベルを接続文字セット/エンコーディングに変換します。クライアント側で UTF-8 を使用しているため、MySQL に UTF-8 を使用していることを伝える必要があります。SET NAMES 'utf8'これは、接続を開くときに最初のクエリとして送信する必要があるMySQL コマンドによって行われます。インストールと、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");

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

于 2009-03-11T09:15:44.447 に答える
14

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

$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
于 2009-03-11T08:56:25.757 に答える
11

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);
于 2009-03-11T08:59:33.923 に答える
5

どこかで見つけて以来、あまり考えずに丸ごと使っています。

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
于 2013-05-05T19:24:07.447 に答える
4

HTML 文字セットを ISO-8859-1 に変更すると問題が解決しました! 馬鹿な

于 2009-03-11T10:13:35.273 に答える
3

聖なるがらくた..これは私を狂わせていました。私は同じことをしようとしていました。utf-8エンコーディングのHTMLヘッダーを追加しました。mysqli_set_charset()は数時間後に私を救いましたが、今は機能していることをうれしく思います。

特殊文字とアクセントをエンコードするためのもう1つの関数は、htmlentities()です。

于 2009-11-13T11:34:41.623 に答える
3

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

$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
于 2014-12-25T23:43:00.253 に答える
2

そもそも、データベースに UTF8 データがあると確信していますか?

于 2009-03-11T10:00:11.453 に答える
2

HTML で Unicode エンコーディングをオンにします。

于 2009-03-11T08:51:40.183 に答える
2

特殊文字を扱うとき、私は常に次のことに気を配っています。

  • データベース、テーブル、およびフィールドの文字セットはすべて utf8_general_* または utf8_unicode_* に設定されています
  • エディタが適切な文字セットで PHP ファイルを保存するようにしています
  • php.ini の default_charset を UTF-8または
  • Content-Type: text/html; を送信します。charset=UTF-8 ヘッダー
  • META タグの文字セットは UTF-8 です (これは Content-Type HTTP ヘッダーによって上書きされます)
  • MySQL に接続するとき、次のクエリを発行します。
    • セット名 utf8
    • キャラクター設定 utf8
    • SET COLLATION_CONNECTION="utf8_general_ci"/"utf8_general_ci"
于 2009-03-11T09:10:02.353 に答える
0

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

于 2013-08-11T16:20:20.953 に答える
0

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

$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
于 2018-08-13T09:22:57.937 に答える