Rumah > Artikel > pembangunan bahagian belakang > Apa yang perlu dilakukan jika php Cina dihantar ke latar belakang dengan aksara yang bercelaru
Penyelesaian kepada aksara Cina bercelaru yang dihantar ke latar belakang dalam PHP: 1. Gunakan "iconv('UTF-8', 'GB2312//IGNORE', $targetFile);" 2. Gunakan "move_uploaded_file("; $tempFile, $targetFile);".
Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer Dell G3.
Apakah yang perlu saya lakukan jika php Cina dihantar ke latar belakang dengan aksara yang bercelaru?
Penyelesaian kepada masalah bercelaru Cina storan latar belakang muat naik fail php:
Penjelasan pemprosesan latar belakang muat naik fail php:
Selepas pengguna memuat naik fail (saya menggunakan uploadify2.3 untuk bahagian hadapan. Saya mahu menyimpannya mengikut nama fail asalnya (kadang-kadang dalam bahasa Cina). Hanya menggunakan arahan move_uploaded_file PHP akan menyebabkan aksara yang kacau (saya pelayan Ubuntu). Anda perlu menggunakan icotargetFile=iconv(′UTF−8′,′GB2312//IGNORE′,targetFile) dahulu; tanpa IGNORE, iconv akan gagal untuk menukar aksara - (bar mendatar) dan memotongnya secara automatik selepas itu. Contohnya:
iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 输出"博客yet" iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 输出"博客"
Jadi kaedah penyimpanan yang betul ialah:
$targetFile = iconv('UTF-8', 'GB2312//IGNORE', $targetFile); // UTF8转GB2312 move_uploaded_file($tempFile, $targetFile); // 服务器把文件暂时放在$tempFile
Oleh kerana transcoding akan kehilangan aksara, kita perlu menyimpan nama fail baharu untuk menentukan aksara yang mana hilang, saya Gunakan helah ini untuk menukar ke belakang dan ke belakang:
$targetFile = iconv('GB2312', 'UTF-8//IGNORE', $targetFile );
Penjelasan tentang pemprosesan latar belakang muat turun fail php:
Bila menggunakan GB2312 dan bila menggunakan UTF8 adalah penting.
Selain itu, ob_clean() dan flush() adalah kunci kepada sama ada fail yang dimuat turun bercelaru
<?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("文件不存在或已被删除"); } ?>
Berikut ialah fail belakang muat naik fail yang saya gunakan dengan uploadify 2.3, untuk rujukan sahaja:
<?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("文件名不合法"); } ?>
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Apa yang perlu dilakukan jika php Cina dihantar ke latar belakang dengan aksara yang bercelaru. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!