php でバックグラウンドに送信される文字化けした中国語の解決策: 1. "iconv('UTF-8', 'GB2312//IGNORE', $targetFile);"; を使用します。 2. "move_uploaded_file( $tempFile、$targetFile);"。
この記事の動作環境: Windows 7 システム、PHP バージョン 7.1、Dell G3 コンピューター。
中国語のphpが文字化けしてバックグラウンドに送信される場合はどうすればよいですか?
php ファイル アップロード バックグラウンド ストレージの中国語文字化け問題の解決策:
php ファイル アップロード バックグラウンド処理の説明:
ユーザーの後ファイルをアップロードします(フロントエンドにはuploadify2.3を使用しています。元のファイル名(場合によっては中国語)に従って保存したいと思っています。PHPのmove_uploaded_fileコマンドを使用するだけで文字化けが発生します(私はUbuntuサーバーです)。最初に icotargetFile=iconv('UTF−8','GB2312//IGNORE',targetFile) を使用する必要があります。IGNORE を使用しないと、iconv は文字 - (水平バー) の変換に失敗し、後で自動的に切り捨てられます。例:
iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 输出"博客yet" iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 输出"博客"
したがって、正しい保存方法は次のとおりです:
$targetFile = iconv('UTF-8', 'GB2312//IGNORE', $targetFile); // UTF8转GB2312 move_uploaded_file($tempFile, $targetFile); // 服务器把文件暂时放在$tempFile
トランスコーディングにより文字が失われるため、新しいファイル名を保存する必要があります。どの文字が失われるかを確認するために、私は次のようにしました。この前後の変換トリック:
$targetFile = iconv('GB2312', 'UTF-8//IGNORE', $targetFile );
php ファイルのダウンロードのバックグラウンド処理の説明:
GB2312 をいつ使用するか、いつ UTF8 を使用するかが重要です。
さらに、ダウンロードしたファイルが文字化けするかどうかの鍵となるのは、ob_clean() と flash() です。
<?php $ROOT = $_SERVER["DOCUMENT_ROOT"]; // 获取根路径 $filename = $_GET["filename"]; // GET方式拿到文件名 $filepath = $ROOT.$filename; // 文件路径UFT8版 $filepath_iconv = iconv('UTF-8', 'GB2312//IGNORE', $ROOT.$filename); // 文件路径GB2312版 if (is_file($filepath_iconv)) // 和上面一样,php的文件系统函数的输入一定要GB2312字符,否则is_file返回false { $fileinfo = pathinfo($filepath); // 返回给客户端的用UFT8 header('Content-type: application/x-'.$fileinfo['extension']); header('Content-Disposition: attachment; filename='.$fileinfo['basename']); header('Content-Length: '.filesize($filepath_iconv)); // GB2312才能访问文件 ob_clean(); // 如果不加这两句的话,下载下来的文件是乱码的 flush(); // 如果不加这两句的话,下载下来的文件是乱码的 readfile($filepath_iconv); // GB2312才能访问文件 exit(); } else { die("文件不存在或已被删除"); } ?>
以下は、uploadify 2.3 で使用するファイル アップロード バックエンド ファイルです (参考のみ) :
<?php error_reporting(0); // 如果需要开启php警告,删除此句 if (!empty($_FILES)) { $my_articleDBtable = $_GET["my_articleDBtable"]; require_once("../../init.php"); // $tmpimgUploadDir在这个文件里 $tempFile = $_FILES['Filedata']['tmp_name']; $originalName = $_FILES['Filedata']['name']; if (empty($tempFile)) { die("抱歉,由于服务器原因,文件上传失败"); } $dateYmd = date("Ymd",strtotime("now")); $targetPath = $ROOT.$attachmentDir.$dateYmd.'/'; //存储文件夹(绝对路径) mkdir($targetPath, 0777, true); $new_dir_name = new_name($_FILES['Filedata']['name']); //将文件名md5加密,仅保留最后一个后缀 mkdir($targetPath.$new_dir_name, 0777, true); $targetFile = $targetPath.$new_dir_name.'/'.$originalName; //移动tmp文件到指定位置,并防止中文文件名乱码。(tmp文件是服务器自动生成的) move_uploaded_file($tempFile, iconv('UTF-8', 'GB2312//IGNORE', $targetFile)); $originalName = iconv('UTF-8', 'GB2312//IGNORE', $originalName); $originalName = iconv('GB2312', 'UTF-8//IGNORE', $originalName); //返回文件地址 $filename = $originalName; $href = $ROOTTOSERVER.$attachmentDir.$dateYmd.'/'.$new_dir_name.'/'.$originalName; $filename = mysql_real_escape_string($filename); $href = mysql_real_escape_string($href); mysql_query("insert into `$my_articleDBtable` (articleName, articleContent) VALUES ('$filename','$href')") or die(mysql_error()); die("success"); } function new_name($filename){ $ret = array(); $ext = pathinfo($filename); $ext = $ext['extension']; $ext = strtolower($ext); if ($ext=='doc'|| $ext=='docx') { $name = basename($filename,$ext); $name = md5($name.time()); //.'.'.$ext; return $name; } die("文件名不合法"); } ?>
推奨学習: 「PHP ビデオ チュートリアル 」
以上がphp中国語が文字化けしてバックグラウンドに送信される場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。