最近、フロントエンドとバックエンドの分離に基づいて Web アプリケーションを開発しているときに、かなり難しい問題に遭遇しました。フロントエンドが JavaScript を使用して画像を Base64 エンコードした後、画像がバックエンドの PHP に送信されます。デコード用のプログラムを実行すると、結果は文字化けしたコードになります。
多くの試みと調査を経て、いくつかの解決策を要約し、参考のために共有します。
まず、base64 エンコードとデコードの基本原理を理解しましょう。 Base64 は、64 文字を使用してバイナリ データを表現する方法です。データは 6 ビットのグループに分類されます。6 ビット値に基づいて、事前定義された文字セットから対応する文字が検索され、元のバイナリ データのバイトコードが置き換えられます。このようにして、あらゆるデータを印刷可能な ASCII 文字に変換して、簡単に送信したり保存したりできます。
JavaScript では、canvas オブジェクトの toDataURL() 関数を呼び出すことで、画像データを含む Base64 でエンコードされた文字列を生成できます。
var canvas = document.createElement('canvas'); canvas.width = 400; canvas.height = 300; var ctx = canvas.getContext('2d'); ctx.fillStyle = '#fff'; ctx.fillRect(0, 0, 400, 300); var img = new Image(); img.src = './test.jpg'; img.onload = function() { ctx.drawImage(img, 0, 0, 400, 300); var dataURL = canvas.toDataURL('image/jpeg', 0.8); // 传输dataURL给后端进行base64解码 };
PHP では、base64_decode() 関数を使用できます。エンコードされた文字列は、さらなる操作のために生のバイナリ データにデコードされます。
しかし、実際に動作させてみると文字化けが発生することがありました。これはなぜでしょうか?
文字化けの原因は次のとおりです。
解決策は次のとおりです。
data:image/jpeg を文字列置換に置き換えることができます。 Base64、プレフィックスと区切り文字を削除し、デコードに Base64 文字列を直接使用します。
$data = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/…'; // base64编码的图片数据 $data = str_replace('data:image/jpeg;base64,', '', $data); $data = str_replace(' ', '+', $data); // 如果出现URL编码中的+,需要替换成空格。 $data = base64_decode($data);
urldecode() 関数を使用して URL エンコードされた文字をデコードし、base64_decode() を使用して Base64 デコードします。
$data = 'data:image/jpeg;base64,%2F9j%2F4AAQSk...'; // base64编码的图片数据 $data = urldecode($data); $data = base64_decode($data);
php.ini で magic_quotes を検索し、オフに設定し、php を再起動して有効にします。
magic_quotes_gpc = Off
フロントエンドとバックエンドでデータを送信するときに、データが変更されていないことを確認するためにデータの整合性をチェックできます。たとえば、md5() を使用して元のデータをダイジェストし、バックエンドに送信できます。その後、バックエンドは受信したバイナリ データをダイジェストし、2 つのダイジェスト値を比較します。それらが同じであれば、データは変更されておらず、デコード操作を実行できます。
まとめ:
以上は、phpのbase64デコードで文字化けが発生する問題を解決する際に、私がまとめた解決策ですので、実際の状況に応じて選択して試してみてください。 Web開発をする上で、問題に遭遇しても恐れず、もっと試し、もっと情報を調べれば、必ず解決策が見つかると信じています。
以上がPHPのbase64エンコードが文字化けした場合の対処法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。