PHPは文字化けしていないが、データベースの背景は文字化けしている

WBOY
リリース: 2016-06-23 14:17:14
オリジナル
832 人が閲覧しました

この投稿は、2013-07-22 18:05:28 に susoft2008 によって最終編集されました

データベースの文字化け データベース PHP の文字化け

図 1 に示すように、PHP は文字化けせずに追加、変更、およびクエリを実行します
MySQL データベース バックエンド図2のような文字化けが表示されます
原因は何でしょうか?

写真 1:


写真 2:

ディスカッションへの返信 (解決策)

文字化けしたコードを見るために使用されたソフトウェアは何ですか?

マスター、解決してください

文字化けしたコード
Toad For MySQL

PS: CVS ファイルはどこでも文字化けしており、中国語になっています。 。 。 。

データベースフィールドの接続調整はデフォルトで latin1 です
保存するデータは utf-8 です
必要な文字セットを mysql に宣言していないため、mysql は依然として latin1 を使用してデータを取得します。あなたにとっては utf-8 です

ただし、mysql 管理ツールは必要な文字セットを宣言する必要があるため、latin1 とみなされる utf8 を utf8 に変換すると文字化けが発生します

PHP の追加、変更、クエリは、図 1 に示すように、文字化けしないでください。
図 2 に示すように、MySQL データベース バックエンドで文字化けが表示されます。
原因は何ですか?

図 1:


図 2:


PS:
ページのエンコーディングは UTF-8 を使用します


データベース テーブルのエンコーディングは UTF-8 を使用します

データベース フィールドの接続照合順序はデフォルトの latin1 です
保存されたデータは utf-8 です
必要な文字セットを mysql に宣言していないため、mysql は依然として latin1 を使用してデータを取得します。あなたにとってそれはutf-8です

ただし、mysql管理ツールは必要な文字セットを宣言する必要があるため、latin1とみなされるutf8をutf8に変換すると文字化けが発生します

校正コードは: utf8_general_ci

そうです、latin1 だと utf-8 データを挿入できないはずです。先ほど返信したとき、データをどのように挿入したかについてまだ考えていました
しかし、これは私が行った説明には影響しません、単にリンクが進んでいるというだけです
mysql のデフォルトの文字セットは latin1 であり、一般的に使用する人はほとんどいませんデフォルトの文字セットは、mysql をインストールするときに変更されます (ほとんどの人はどこを変更すればよいのかわかりません)
そのため、mysql を操作するためにデフォルト以外の文字セットが使用されている限り、その前にセット名の文字セット コードを実行する必要があります。操作
utf-8 の場合、名前は utf8 に設定されます
次のコードを utf-8 エンコードで保存して実行します

<?phpheader('Content-type: text/html;charset=utf-8');echo iconv('latin1', 'utf-8', '供应商-西施');
ログイン後にコピー
ログイン後にコピー
または、次のコードを gbk エンコードで保存して実行します
<?phpheader('Content-type: text/html;charset=utf-8');echo iconv('latin1', 'utf-8', iconv('gbk', 'utf-8', '供应商-西施'));
ログイン後にコピー
ログイン後にコピー
が表示されます。 result

3 つの点が一致していて、文字化けが発生しないことを確認してください:
1、データベースとデータテーブルのエンコーディング
2. ページ内部のエンコーディング
3. ファイルのエンコーディング

そうです、latin1 の場合は、 utf-8 データを挿入できないはずです。先ほど返信したとき、データをどのように挿入したかについてまだ考えていました
しかし、これは私が行った説明には影響しません、単にリンクが進んでいるというだけです
mysql のデフォルトの文字セットは latin1 であり、一般的に使用する人はほとんどいませんデフォルトの文字セットは、mysql のインストール時に変更されます (ほとんどの人はどこを変更すればよいのかわかりません)
そのため、mysql を操作するためにデフォルト以外の文字セットが使用されている限り、その前にセット名の文字セット コードを実行する必要があります。操作
utf-8 の場合、名前は utf8 に設定されます
次のコードを utf-8 エンコードで保存して実行します

<?phpheader('Content-type: text/html;charset=utf-8');echo iconv('latin1', 'utf-8', '供应商-西施');
ログイン後にコピー
ログイン後にコピー
または次のコードを gbk エンコードで保存して実行します
<?phpheader('Content-type: text/html;charset=utf-8');echo iconv('latin1', 'utf-8', iconv('gbk', 'utf-8', '供应商-西施'));
ログイン後にコピー
ログイン後にコピー
で、この結果が表示されます



ちょっと理解できません、そして問題がどこにあるのかまだわかりません もう?データベースのエンコーディングは UTP8 である必要があります: "show variables like 'character_set_database';" ---》UTF8@~~~~~~~~~~~ に戻ります

キーはcharacter_set_server の値です

文字化けしたコードがあるので探してみましょう

キーはcharacter_set_serverの値です
アプリケーションは購入した仮想ホスト上で公開されています Character_set_serverの値を確認するにはどうすればよいですか?

キーはcharacter_set_serverの値です

アドバイスありがとうございます

'character_set_server'のような変数を表示します

'character_set_server'のような変数を表示します


結果はUTF-8です

これはちょっと無理です、最後の手段
select BINARYsupplier_ from tbl_name where id_=17

echobase64_encode('retrieved data');
結果を投稿してください

これはちょっと無理です、最後の手段
select BINARYsupplier_ from tbl_name where id_=17

echo base64_encode('retrieved data');
結果を投稿します

結果は以下のようになります (結果はデー​​タベース クライアントの結果であり、PHP ページ データは正常に表示されます)。 PS: この投稿のテーマの内容 2 つの写真 -- 》写真 1 は正常に表示される PHP ページ、写真 2 は文字化けが表示されるデータベース クライアント、CV もどこでも文字化けします




ステッカーの用途は何ですか?

プログラムを使って文字化けした内容を抽出し、base64でエンコードした値を投稿してほしい
これは解析に役立ちます

なお、文字化けしたコードを投稿する場合は、文字化けしていない内容も投稿してください

ぜひ投稿してください写真は何の役に立つのですか?

プログラムを使って文字化けしたコンテンツを抽出し、base64 でエンコードされた値を投稿してほしいです
これは分析に役立ちます

以下に示すように、理解しました、ありがとうボス


それに、文字化けしたコンテンツも投稿する必要がありますコードも同時に投稿してください 文字化けした内容:


文字化けした内容:


BINARY使用後の文字化け内容:

こんな結果になってほしい

echobase64_encode($t);//w6fCscK7w6fCm8Kuw6XCm8Kb
$これはキーです BINARY (バイナリ) モードで読み取られた文字化けしたフィールドの内容

グラフで比較します (方法 #7) あなたのデータはまだ latin1 utf-8 として扱われます
文字セットを変更する前にこれらのデータを挿入しましたか?

Iこのような結果が得られるようにしてください

echobase64_encode($t);//w6fCscK7w6fCm8Kuw6XCm8Kb
$t は、BINARY (バイナリ) モードで読み取られた文字化けしたフィールドの内容です

グラフで比較してください (方法 #7) あなたのものはまだ UTF です-8 は latin1 として扱われます
文字セットを変更する前にこれらのデータを挿入しましたか?
いいえ。 。文字セットは変更されていません。挿入する前にデータベースのエンコーディングが UTF8 に設定されていないはずです。
QQ に相談してください。
結果を取得してください。このように
echobase64_encode($t); //w6fCscK7w6fCm8Kuw6XCm8Kb
$t は BINARY (バイナリ) モードで読み取られた文字化けしたフィールドの内容です

グラフィック比較 (#7 の方法) によれば、utf-8 はまだ扱われていますlatin1 として
これらのデータはあなたによって変更されました

3Q
前に挿入された文字セットですか?

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート