PHP / MySQLの特殊文字
-
10-07-2019 - |
質問
データベースに特殊文字を含む単語があります(ほとんどがスペイン語で、チルダのように)。 データベースにはすべてが保存され、PHPmyAdminで正しく表示されますが、データを(PHPを使用して)取得してブラウザーに表示すると、「?」のような奇妙な文字が表示されます。正方形で... 一般的な修正が必要なので、毎回各文字をエスケープする必要はありません。また、PHPフォームからデータベースに特別なスペイン語文字を挿入することもできます。
HTMLは正しい:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
すべてのテーブルとデータベースはutf8_spanishに設定されます
取得する文字:&#65533;
任意の提案???
ありがとう!!!
解決 4
HTML文字セットをISO-8859-1に変更すると、問題が修正されました!愚かな
他のヒント
によって提案されたソリューションの詳細を提供したいだけです。 vartec (MySQLのインストールによって異なります)は、問題に対する最も正しい解決策です。 まず、MySQLの文字セット/エンコーディングの問題は、MySQLマニュアル 9.1章「文字セットのサポート」。あなたの場合、特に 9.1.4。 &quot;接続文字セットと照合順序&quot; が最も適切です。
短くするために: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'");
聖なるがらくた..私は同じことをしようとしていました。 utf-8エンコードHTMLヘッダーを追加しました。数時間後にmysqli_set_charset()で保存されましたが、今は動作していることがうれしいです
特殊文字とアクセントのエンコードを試みる別の関数はhtmlentities()
です次のことができます。
$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
HTMLのUnicodeエンコーディングを有効にします。
特殊文字を扱うとき、私は常に次のことに注意します:
- データベース、テーブル、およびフィールドの文字セットはすべて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
- SET CHARACTER SET utf8
- SET COLLATION_CONNECTION =&quot; utf8_general_ci&quot; /&quot; utf8_general_ci&quot;
最初にデータベースにUTF8データがあるかどうか
私のために働いた答えは、Stefan Gehrigが投稿したものです:
$ mysqli-&gt; set_charset(&quot; utf8&quot;);
接続と解決した問題を定義した後、その行を追加する必要がありました! :)
(コメントできないため回答を投稿しています...)
私の解決策は: 上記のすべてを提供する ただし、notepad ++で作業しているため、ファイルを保存する必要があります このように:manuタブでエンコーディングに移動します ファイルを保存します-&gt; 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