PHPバイナリストリームが文字化けを出力する場合の対処方法

藏色散人
リリース: 2023-03-17 07:50:01
オリジナル
1929 人が閲覧しました

php バイナリ ストリームの出力が文字化けする場合の解決策: 1. ローカルの「conn.php」ファイルと「print.php」ファイルを開きます; 2. 「ob_clean」を使用してヘッダーの内容をクリアし、コードを変更します「mysql_close(); ob_clean();header("Content-type:$type");」など。

PHPバイナリストリームが文字化けを出力する場合の対処方法

このチュートリアルの動作環境: Windows 7 システム、PHP バージョン 8.1、Dell G3 コンピューター。

php バイナリ ストリーム出力が文字化けしている場合はどうすればよいですか?

最近、PHP を使用して開発し、mysql からバイナリ ファイルを読み取って出力したのですが、文字化けの問題が発生しました。

一般的には以下の方法でバイナリファイルを出力します。

<?php
if(!isset($id) or $id=="") die("error: id none");
//定位记录,读出
$conn=mysql_connect("127.0.0.1","***","***");
if(!$conn) die("error : mysql connect failed");
mysql_select_db("test",$conn);
$sql = "select * from receive where id=$id";
$result = mysql_query($sql);
$num=mysql_num_rows($result);
if($num<1) die("error: no this recorder");
$data = mysql_result($result,0,"file_data");
$type = mysql_result($result,0,"file_type");
$name = mysql_result($result,0,"file_name");
mysql_close($conn);
//先输出相应的文件头,并且恢复原来的文件名
header("Content-type:$type");
header("Content-Disposition: attachment; filename=$name");
echo $data;
?>
ログイン後にコピー

上記の方法で問題ありません。ただし、データベース接続を別のファイルにカプセル化すると、問題が発生します。上記のコードを 2 つのファイルに書き換えます。

//conn.php
<?php
function Open_DB(){
$conn=mysql_connect("127.0.0.1","***","***");
if(!$conn) die("error : mysql connect failed");
mysql_select_db("test",$conn);
}
?>
ログイン後にコピー
//print.php
<?php
if(!isset($id) or $id=="") die("error: id none");
//定位记录,读出
require_once(&#39;conn.php&#39;);
Open_DB();
$sql = "select * from receive where id=$id";
$result = mysql_query($sql);
$num=mysql_num_rows($result);
if($num<1) die("error: no this recorder");
$data = mysql_result($result,0,"file_data");
$type = mysql_result($result,0,"file_type");
$name = mysql_result($result,0,"file_name");
mysql_close();
header("Content-type:$type");
header("Content-Disposition: attachment; filename=$name");
echo $data;
?>
ログイン後にコピー

このとき、print.php を呼び出して Word ファイルを開くと文字化けが発生します。問題は「require_once('conn.php')」ステートメントにあります。 PHP がこのステートメントを呼び出すと、ヘッダーに出力され、次の 2 つのヘッダー ステートメントに影響を及ぼし、Word ファイルのデータ フローが破壊されます。そのため、開いたワードファイルが文字化けしてしまいます。

解決策は、ob_clean を使用してヘッダーの内容をクリアすることです。書き換えられた print.php は次のとおりです

//print.php
<?php
if(!isset($id) or $id=="") die("error: id none");
//定位记录,读出
require_once(&#39;conn.php&#39;);
Open_DB();
$sql = "select * from receive where id=$id";
$result = mysql_query($sql);
$num=mysql_num_rows($result);
if($num<1) die("error: no this recorder");
$data = mysql_result($result,0,"file_data");
$type = mysql_result($result,0,"file_type");
$name = mysql_result($result,0,"file_name");
mysql_close();
ob_clean();
header("Content-type:$type");
header("Content-Disposition: attachment; filename=$name");
echo $data;
?>
ログイン後にコピー

推奨学習: "PHP ビデオ チュートリアル "

以上がPHPバイナリストリームが文字化けを出力する場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!