ホームページ  >  記事  >  バックエンド開発  >  Thinkphp3.1.3 が Oracle に接続して JSON を返すと、奇妙なエンコーディングの問題が発生する

Thinkphp3.1.3 が Oracle に接続して JSON を返すと、奇妙なエンコーディングの問題が発生する

WBOY
WBOYオリジナル
2016-06-23 13:33:07883ブラウズ

環境: thinkphp3.1.3+oracle10.2g、Oracle のエンコーディングは ZHS16GBK で、正常に接続してデータを確認できます。サーバーは apache+php5.4.33 です。単に選択クエリを使用すると、ajaxreturn を使用するか、PHP の組み込み json_encode() を使用するかに関係なく、返された json 内の中国語が文字化けしますが、再度更新すると、正しい中国語表示が表示され、今後は常に正常になります。もう少し時間がかかります。データベースに関連している可能性があります。接続が切断された後、再度確認するとコードが再び文字化けしていましたが、更新すると正常に戻りました。 。 。 Apacheを再起動するたびに、最初のクエリでこの現象が発生します。iconvまたはmb_convert_encodingを使用して、返されたjsonのエンコードを変更しようとしましたが、この現象は、クエリをファイルにキャッシュして取得するたびに発生します。初回はエラー中国語のキャッシュファイルに中国語が含まれていますが、エンコーディングは GB2312 です。キャッシュ ファイルを削除し、更新後にキャッシュを再生成すると、キャッシュ ファイルのエンコーディングは utf-8 になります。 。 。試してみましたが、TPフレームワークを使わずにPHPで直接データベースに接続してクエリを実行すると、初回でも何度でも正しい中国語が出てきます。この奇妙な問題は私にとって不可解です、助けてください。 。 。


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

最初のエラーは、中国語のキャッシュされたファイルに中国語の文字が含まれていたが、エンコードが GB2312 であったということでした。キャッシュされたファイルを削除し、キャッシュを更新して再生成し、キャッシュされたファイルのエンコードを変更してください。ファイルが変更されました。utf-8 になりました

更新された内容は以前と同じですが、エンコーディングが変更されましたか?

最初のエラーは、中国語のキャッシュ ファイルに中国語の文字が含まれているということでしたが、エンコーディングは GB2312 でした。キャッシュされたファイルを削除し、更新後にキャッシュを再生成すると、キャッシュされたファイルのエンコーディングは utf-8 になりました。内容は以前と同じですが、エンコードが変更されましたか?
内容は同じですが、エンコードが異なります。2 つのキャッシュ ファイルを保存し、notepad++ で開きました。間違ったものは右下隅に GB2312 を表示し、正しいエンコードは phpstudylite を使用しました。環境はapache+php5.4のfcgi方式。

1. thinkphp は utf-8 文字セットを使用して動作し、gbk バージョンはありません 2. json_encode は utf-8 中国語のみをサポートします

したがって、受信と送信の両方が utf-8 である必要があるため、接続するときにそれを宣言しますoracle ZHS16GBK は間違っています。これが問題の根本です


1. thinkphp は utf-8 文字セットを使用して動作しますが、gbk バージョンはありません

2. json_encode は utf-8 中国語のみをサポートします

したがって、受信と送信の両方が utf である必要があります-8 なので、oracle に接続するときに ZHS16GBK を宣言するのは間違いです。これが問題の根本です
Oracle エンコーディングの問題ではないかとも疑っていますが、Oracle エンコーディングは変更できません。現在、tp の終わりはすべてデフォルトになっています。つまり、最初に確認するときは、 tp のアクションで 2 つのクエリ操作が実行された場合、同じことが JSON 出力にも当てはまります。 。 。すごく変ですね

データベース接続時にZHS16GBKをUTF-8に変更しましたか?

データベースに接続するときに ZHS16GBK を UTF-8 に変更しましたか?試してみましたか?

データベースに接続するときに utf8 を使用してください。 tp の構成で構成されたデータベース文字セットは utf8 です。 。 。これは、zhs16gbk に設定されている場合にも当てはまります

データベースに初めて接続したときに返されるデータは正しくエンコードされておらず、再度操作する際には問題ありません。これは間違いなく Oracle の何らかのメカニズムに関連しています。解決済み 問題は、$pre->M();$pre_list =$pre->query('select sysdate from Dual') を初期化クラスに直接追加したことです。すべてのクラスが継承すること: common.action.class ; すべてのデータ操作を開始する前にライブラリに接続することと同じです。これは、接続を初期化することと同じです。が中国語で返されると、異常にエンコードされるはずですが、それを返す必要はありません。初期化するだけで、他の操作を実行するときにエンコードが正常になります。 2 人のモデレーターの返信に感謝します。投稿するとポイントが付与されます。ありがとうございます。 。 。

やっと分かりました。 Apache の fcgi 設定に php 環境を直接追加します: FcgidInitialEnv NLS_LANG AMERICAN_AMERICA.UTF8。fcgi 接続であるため、php の環境内の多くのデータは利用できません。最初に追加したのは fcgi 設定です。 zhs16gbk の設定は win の場合と同じですが、前回、Oracle がクライアントの文字セットに従って自動的にトランスコードすることを確認して、先ほど試してみましたが、案の定、出力されるデータは Oracle によって自動的に utf8 エンコーディングに戻されました。したがって、接続を初期化する必要はありません。 。 。将来的に、Oracle に接続したい学生がいて、PHP が fcgi メソッドで設定されている場合は、参考にしてください

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHPも20周年次の記事:PHPも20周年