多くの場合、多言語のWebサイトやアプリケーションを開発する際に、キャラクターをエンコードする問題が開発者にとって頭痛になります。特に、データベースとPHPプログラムの間のキャラクターが一貫していない場合、文字化けされた漢字や特殊文字のエラーを表示するなどの問題を引き起こすのは非常に簡単です。 PHPは文字セット設定を制御するための複数の手段を提供しますが、 MBSTring拡張機能の非常に実用的な機能を無視する場合があります-MB_GET_INFO() 。
この記事では、 MB_GET_INFO()関数を使用して、PHPで現在使用されているマルチバイト文字エンコードを確認し、データベース設定と比較して、2つが一貫しているかどうかを判断する方法を紹介します。
MB_GET_INFO()は、PHPマルチバイトストリングエクステンション(MBSTRING)の関数であり、現在のMBSTRingの関連する設定情報を返します。
mb_get_info(string $type = null): string|array
パラメーターが渡されない場合、関連するすべての設定情報を含む配列が返されます。
「internal_encoding」などのパラメーターを渡すと、現在の内部エンコードが得られます。
データベースに接続するときにEncodingをUTF8MB4に設定すると仮定すると、PHPのマルチバイト文字列設定が次の手順で一貫しているかどうかを確認できます。
$mysqli = new mysqli('localhost', 'user', 'password', 'my_database');
$mysqli->set_charset('utf8mb4');
データベース接続の文字セットが、 UTF8MB4などの目的エンコードに設定されていることを確認してください。
$mbInfo = mb_get_info();
echo "現在 mbstring 内部エンコーディング: " . $mbInfo['internal_encoding'] . PHP_EOL;
またはより簡潔な書き方:
echo "現在 mbstring コーディング: " . mb_get_info("internal_encoding") . PHP_EOL;
デフォルトでは、MbStringの内部エンコーディングはUTF-8である可能性がありますが、矛盾を防ぐために明示的に設定する必要があります。
mb_internal_encoding("UTF-8");
完全な検出コードは次のとおりです。
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'my_database');
$mysqli->set_charset('utf8mb4');
mb_internal_encoding("UTF-8");
$dbCharset = $mysqli->character_set_name(); // データベース接続の文字セットを取得します
$phpCharset = mb_get_info("internal_encoding"); // 得る PHP 文字セット
if (strcasecmp($dbCharset, $phpCharset) === 0 || stripos($dbCharset, $phpCharset) !== false) {
echo "? データベース文字セットと PHP の mbstring コーディング一致:$dbCharset" . PHP_EOL;
} else {
echo "? 一貫性がない!数据库使用の是 $dbCharset,PHP mbstring 使用の是 $phpCharset" . PHP_EOL;
}
?>
デフォルトのエンコードを常に設定します:プロジェクトが初期化されたときに、エントリファイルに入れられるなど、 MB_INTERNAL_ENCODING()を均一に設定します。
mbstring拡張機能が有効になっているかどうかを確認してください。
if (!extension_loaded('mbstring')) {
die("mbstring 拡張機能が有効になっていません,お願いします php.ini 開ける!");
}
フロントエンドの一貫性の維持:フロントエンドのHTMLページは、次のような一貫した文字セットも宣言する必要があります。
<meta charset="UTF-8">
MB_GET_INFO()自体はデータベース文字設定設定に直接アクセスしませんが、PHPマルチバイト文字列環境を観察するためのウィンドウを提供します。その結果をデータベースに接続した文字セットと比較することにより、一貫性のないエンコーディングをより簡単にトラブルシューティングできます。キャラクターセットの問題が開発プロセスを悩ませるのを止めてください。事前にチェックして、半分の労力で結果を2倍にしてください!
コーディングスキルについては、 https://gitbox.net/php/encoding-guideをご覧ください