php バイナリ ストリームの出力が文字化けする場合の解決策: 1. ローカルの「conn.php」ファイルと「print.php」ファイルを開きます; 2. 「ob_clean」を使用してヘッダーの内容をクリアし、コードを変更します「mysql_close(); ob_clean();header("Content-type:$type");」など。
このチュートリアルの動作環境: 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('conn.php'); 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('conn.php'); 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 サイトの他の関連記事を参照してください。