ホームページ >バックエンド開発 >PHPの問題 >php、curl、gzipが文字化けする

php、curl、gzipが文字化けする

WBOY
WBOYオリジナル
2023-05-06 21:21:091289ブラウズ

近年、インターネットの発展に伴い、Webサービスの利用が増加しています。その中でも、PHP は人気のオープンソース プログラミング言語として、Web 開発の分野で広く使用されており、最も頻繁に使用される言語となっています。 PHP 開発では、HTTP リクエストの送信と HTTP レスポンスの受信に cURL ライブラリを使用するのが一般的です。同時に、ほとんどの HTTP 応答では、サーバーは gzip 圧縮アルゴリズムを有効にして応答を圧縮します。これにより、ネットワーク伝送帯域幅と時間が節約され、Web アプリケーションのパフォーマンスが向上します。ただし、PHPカールを使用してHTTPリクエストを行う場合、返されるレスポンスボディがgzip圧縮されている場合、文字化けが発生する場合があります。この記事では、PHPのcurlでgzipが返される文字化けの問題を解決する方法に焦点を当てます。

1. Gzip 圧縮アルゴリズム

gzip 圧縮アルゴリズムは、HTML、CSS、JavaScript ファイルなどの Web リソース ファイルを圧縮するためによく使用される可逆圧縮アルゴリズムです。これらのファイルは保存時や送信時に圧縮されるため、Web 上でのファイル送信時に大量の冗長データが排除され、送信時間と帯域幅の要件が軽減されます。 Web ブラウザとサーバーの両方が gzip 圧縮をサポートしています。これは、gzip が HTTP/1.1 プロトコルの標準となっており、Web アプリケーションのパフォーマンスが大幅に向上しているためです。

gzip 圧縮アルゴリズムの原理は、ファイルを個別に圧縮するときに、ハフマン コーディングを使用して各ファイルを対応するバイナリ エンコーディングに変換することです。ハフマン符号化は、圧縮対象に応じて異なる符号化テーブルを使用する可変長符号化です。同じ長さの文字シーケンスの場合、ハフマン エンコーディングを使用した圧縮は、固定語長を使用したエンコーディングよりも必要な記憶領域が少なくなります。これが、gzip 圧縮アルゴリズムが効率的である理由の 1 つです。圧縮ファイルでは、識別子としての最初のバイトを除き、残りのバイトがハフマン エンコードによって生成されます。

II. PHP での Gzip 圧縮curl

PHP は、ネットワーク通信用のcurl ライブラリを提供します。 HTTP リクエストを送信し、HTTP レスポンスを受信するには、curl ライブラリを使用します。 HTTP リクエストを送信するときは、リクエストされた URL、リクエスト メソッド、リクエスト ヘッダーなど、curl ライブラリの関連パラメータを設定する必要があります。 HTTP 応答を受信すると、curl ライブラリはデフォルトで応答本文を gzip 形式で自動的に解凍します。通常、PHP 開発者は、curl_setopt() 関数を呼び出してリクエストのパラメータを構成し、CURLOPT_ENCODING を gzip に設定して、curl を介した gzip 形式の応答をサポートできます。

$ch =curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/path/to/api");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
$response =curl_exec($ch);
curl_close($ch );
echo $response;

III. PHP カールで発生する問題

PHP カール ライブラリを使用すると、 gzip を使用して圧縮された特定の HTTP 応答が頻繁に発生します。解凍後も中国語の文字化けの問題が発生します。この種の中国語文字化けの原因は、サーバーによって圧縮されたファイル内に Unicode でエンコードされた文字が含まれており、curl ライブラリがデフォルトでこれらの Unicode でエンコードされた文字を正しく処理しないため、解凍および復元のプロセスでエラーが発生するためです。圧縮ファイル。

たとえば、HTTP リクエストに対する応答は次のとおりです:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content -エンコーディング: gzip
Vary: Accept-Encoding
Content-Length: 135

H4sIAAAAAAAAAG3QwQ2DMBDH8fc8D2l1p7hAUEiyklH6eAINu6cZm3jKDyL4ItZAN1RSxVVWUKpN
wIU8qf1Jc4S2uK4Wq5674tLLasa5B tU4mSivZkR 5tb6637HP NzJjvY Xt1vVy5Pz5v9h D7mJj
nTfBsGsqFQAAA==

のようです。このレスポンス ヘッダーとレスポンス本文には問題はありませんが、上記の PHP カール コードを使用してリクエストを行うと、次のレスポンスが返されます:

�j\ko?t[��_mK” �Ix۱�E�U� c�">W��6

このレスポンス本文には文字化けが含まれています。これは、応答本文が gzip 圧縮を使用しており、UTF-8 でエンコードされた文字が含まれているためです。この応答本文を正しく解凍して復元するには、PHP Curl ライブラリでいくつかの設定が必要です。

IV. 解決策

1. gzdecode を使用して解凍する

PHP 関数 gzdecode() は、gzip 形式のファイルを解凍するメソッドであり、curl を直接返すために使用できます。 gzip ファイルを解凍して、正しいファイルを取得します。

$ch =curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/path/to/api");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
$response =curl_exec($ch);
curl_close($ch );
echo gzdecode($response);

2. iconv を使用してトランスコードする

中国語の文字化けの問題を解決するもう 1 つの方法は、PHP の iconv 関数を使用することです。関数を実行する前に、文字列関数 substr() を呼び出して圧縮ファイルの最初の 2 バイトが占めるスペースをインターセプトし、iconv 関数を使用して文字列を変換して正しい中国語文字を取得する必要があります。

$ch =curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/path/to/api");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
$response =curl_exec($ch);
curl_close($ch);
$response = substr($response, 10); // gzip 形式で圧縮されたファイルの最初の 10 バイトを削除します
$response = iconv('UTF-8', 'GBK//IGNORE', $response ) ;
echo $response;

まとめ

PHP カール ライブラリを使用して HTTP リクエストとレスポンスを実行する場合、サーバーは Gzip 圧縮アルゴリズムを有効にして、データ送信量を削減し、Web アプリケーションのパフォーマンスを向上させます。ただし、PHP のカール ライブラリを使用すると、中国語の文字化けの問題が発生する可能性がありますが、これは時間内に解決する必要があります。中国語の文字化けを解決するには、gzdecodeを使って解凍したり、iconv関数を使ってトランスコードしたりするなど、さまざまな方法があります。実際の開発では、ニーズや実情に応じて適切な方法を選択して中国語文字化け問題を解決できます。

以上がphp、curl、gzipが文字化けするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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