Maison  >  Article  >  développement back-end  >  Que faire si le chinois php est envoyé en arrière-plan avec des caractères tronqués

Que faire si le chinois php est envoyé en arrière-plan avec des caractères tronqués

藏色散人
藏色散人original
2021-12-21 09:59:271781parcourir

Solution aux caractères chinois tronqués en PHP envoyés en arrière-plan : 1. Utilisez "iconv('UTF-8', 'GB2312//IGNORE', $targetFile);" 2. Utilisez "move_uploaded_file($tempFile, $targetFile); ) ;

Que faire si le chinois php est envoyé en arrière-plan avec des caractères tronqués

L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur Dell G3.

Que dois-je faire si le php chinois est envoyé en arrière-plan avec des caractères tronqués ?

Solution au problème chinois tronqué du stockage en arrière-plan du téléchargement de fichiers php :

Explication du traitement en arrière-plan du téléchargement de fichiers php :

Après que l'utilisateur a téléchargé le fichier (j'utilise uploadify2.3 pour le front-end), j'espère pouvoir suivre son fichier d'origine Lors de l'enregistrement du nom (parfois en chinois), seule l'utilisation de la commande move_uploaded_file de PHP entraînera des caractères tronqués (je suis un serveur Ubuntu). Vous devez d'abord utiliser icotargetFile=iconv(′UTF−8′,′GB2312//IGNORE′,targetFile) ; sans ajouter IGNORE, iconv ne parviendra pas à convertir le caractère - (barre horizontale) et le tronquera automatiquement par la suite. Par exemple :

iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 输出"博客yet"
iconv('UTF-8', 'GB2312//IGNORE', "博客—yet"); // 输出"博客"

Donc, la méthode de stockage correcte est :

$targetFile = iconv('UTF-8', 'GB2312//IGNORE', $targetFile); // UTF8转GB2312
move_uploaded_file($tempFile, $targetFile);  // 服务器把文件暂时放在$tempFile

Parce que le transcodage entraînera une perte de caractères, nous devons enregistrer le nouveau nom de fichier. Afin de déterminer quels caractères sont perdus, j'ai utilisé l'astuce de la conversion dans les deux sens. ceci :

$targetFile = iconv('GB2312', 'UTF-8//IGNORE', $targetFile );

php Explication du traitement en arrière-plan du téléchargement de fichiers :

Quand utiliser GB2312 et quand utiliser UTF8 est important.

De plus, ob_clean() et flush() sont la clé pour savoir si le fichier téléchargé est tronqué

<?php
$ROOT = $_SERVER["DOCUMENT_ROOT"]; // 获取根路径
$filename = $_GET["filename"]; // GET方式拿到文件名
$filepath = $ROOT.$filename; // 文件路径UFT8版
$filepath_iconv = iconv(&#39;UTF-8&#39;, &#39;GB2312//IGNORE&#39;, $ROOT.$filename); // 文件路径GB2312版
if (is_file($filepath_iconv))  
// 和上面一样,php的文件系统函数的输入一定要GB2312字符,否则is_file返回false
{ 
    $fileinfo = pathinfo($filepath); // 返回给客户端的用UFT8
    header(&#39;Content-type: application/x-&#39;.$fileinfo[&#39;extension&#39;]);
    header(&#39;Content-Disposition: attachment; filename=&#39;.$fileinfo[&#39;basename&#39;]);
    header(&#39;Content-Length: &#39;.filesize($filepath_iconv)); // GB2312才能访问文件
    ob_clean();  // 如果不加这两句的话,下载下来的文件是乱码的
    flush();  // 如果不加这两句的话,下载下来的文件是乱码的
    readfile($filepath_iconv); // GB2312才能访问文件
    exit();
}
else { die("文件不存在或已被删除"); }
?>

Ce qui suit est le fichier backend de téléchargement de fichiers que j'utilise avec uploadify 2.3, pour référence seulement :

<?php
error_reporting(0); // 如果需要开启php警告,删除此句
if (!empty($_FILES)) {
    $my_articleDBtable = $_GET["my_articleDBtable"];
    require_once("../../init.php"); // $tmpimgUploadDir在这个文件里
    $tempFile = $_FILES[&#39;Filedata&#39;][&#39;tmp_name&#39;];
    $originalName = $_FILES[&#39;Filedata&#39;][&#39;name&#39;];
    if (empty($tempFile)) { die("抱歉,由于服务器原因,文件上传失败"); }
    $dateYmd = date("Ymd",strtotime("now"));
    $targetPath = $ROOT.$attachmentDir.$dateYmd.&#39;/&#39;; //存储文件夹(绝对路径)
    mkdir($targetPath, 0777, true);
    $new_dir_name = new_name($_FILES[&#39;Filedata&#39;][&#39;name&#39;]); //将文件名md5加密,仅保留最后一个后缀 
    mkdir($targetPath.$new_dir_name, 0777, true);
    $targetFile = $targetPath.$new_dir_name.&#39;/&#39;.$originalName;
    //移动tmp文件到指定位置,并防止中文文件名乱码。(tmp文件是服务器自动生成的)
    move_uploaded_file($tempFile, iconv(&#39;UTF-8&#39;, &#39;GB2312//IGNORE&#39;, $targetFile));
    $originalName = iconv(&#39;UTF-8&#39;, &#39;GB2312//IGNORE&#39;, $originalName);
    $originalName = iconv(&#39;GB2312&#39;, &#39;UTF-8//IGNORE&#39;, $originalName);
    //返回文件地址
    $filename = $originalName;
    $href = $ROOTTOSERVER.$attachmentDir.$dateYmd.&#39;/&#39;.$new_dir_name.&#39;/&#39;.$originalName;
    $filename = mysql_real_escape_string($filename);
    $href = mysql_real_escape_string($href);
    mysql_query("insert into `$my_articleDBtable` (articleName, articleContent) VALUES (&#39;$filename&#39;,&#39;$href&#39;)") or die(mysql_error());
    die("success");
}
function new_name($filename){
    $ret = array();
    $ext = pathinfo($filename);
    $ext = $ext[&#39;extension&#39;];
    $ext = strtolower($ext);
    if ($ext==&#39;doc&#39;|| $ext==&#39;docx&#39;) 
    {
        $name = basename($filename,$ext); 
        $name = md5($name.time()); //.&#39;.&#39;.$ext;
        return $name;
    }
    die("文件名不合法");
}
?>

Apprentissage recommandé : " Tutoriel vidéo PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn