ここでAPIを混合しています、
mysql_*およびmysqli_*混ざりません。mysqli_に固執する必要があります (とにかくそうですが)mysql_*として 関数は非推奨になり、PHP7では完全に削除されました。
実際の問題は、どこかの文字セットの問題です。アプリケーションに適切な文字セットを取得するのに役立ついくつかのポインタを次に示します。これはほとんどをカバーします PHP/MySQLアプリケーションを開発するときに直面する可能性のある一般的な問題の1つです。
- すべて アプリケーション全体の属性はUTF-8に設定する必要があります
- ドキュメントをBOMなしのUTF-8として保存します(Notepad ++を使用している場合は、
Format->Convert to UTF-8 w/o BOM) -
PHPとHTMLの両方のヘッダーはUTF-8に設定する必要があります
-
HTML (
<head></head>内 タグ):<meta charset="UTF-8"> -
PHP (ファイルの先頭、出力前):
header('Content-Type: text/html; charset=utf-8');
-
-
データベースに接続したら、接続オブジェクトの文字セットをUTF-8に設定します(接続直後)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */これは
mysqli_*用です 、mysql_*にも同様のものがあります およびPDO(この回答の下部を参照)。 -
また、データベースとテーブルがUTF-8に設定されていることを確認してください。これは、次のように実行できます。
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;(すでに保存されているデータは適切な文字セットに変換されないため、クリーンなデータベースを使用してこれを行うか、文字が壊れている場合はこれを行った後にデータを更新する必要があります。)
-
json_encode()を使用している場合 、JSON_UNESCAPED_UNICODEを適用する必要がある場合があります フラグ。それ以外の場合は、特殊文字を16進数に相当するものに変換します。
すべてであることを忘れないでください コードのパイプライン全体でUFT-8に設定する必要があります。そうしないと、アプリケーションで文字が壊れることがあります。
このリストに加えて、文字セットを指定するための特定のパラメーターを持つ関数が存在する場合があります。マニュアルにはこれについて説明されています(例は htmlspecialchars()
。
マルチバイト文字用の特別な関数もあります。例:strtolower() マルチバイト文字を下げることはありません。そのため、mb_strtolower()を使用する必要があります。 、こちらのライブデモをご覧ください
。
注1 :その場所が
utf-8として示されていることに注意してください (ダッシュ付き)、およびutf8としての場所 (それなしで)。通常は互換性がないため、どちらをいつ使用するかを知っておくことが重要です。たとえば、HTMLとPHPはutf-8を必要とします 、しかしMySQLはそうではありません。注2 :MySQLでは、「charset」と「collation」は同じものではありません。エンコーディングと照合の違いは? 。ただし、両方ともutf-8に設定する必要があります。通常、照合は
utf8_general_ciのいずれかである必要があります またはutf8_unicode_ci、 UTF-8:一般を参照してください。置き場? Unicode?a> 。注3 :絵文字を使用している場合は、MySQLを
utf8mb4で指定する必要があります 標準のutf8の代わりに文字セット 、データベースと接続の両方。 HTMLとPHPにはUTF-8があります 。
mysql_を使用したUTF-8の設定 およびPDO
-
PDO:これはオブジェクトのDSNで行われます。
charsetに注意してください 属性、$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass"); -
mysql_:これはmysqli_*と非常によく似ています。 、ただし、最初の引数としてconnection-objectを取りません。mysql_set_charset('utf8');