Maison développement back-end tutoriel php Comment résoudre le problème des caractères tronqués lors de l'importation de fichiers CSV dans PHP

Comment résoudre le problème des caractères tronqués lors de l'importation de fichiers CSV dans PHP

Jul 03, 2018 pm 04:15 PM
乱码

Cet article présente principalement la solution au problème des caractères tronqués lors de l'importation de fichiers csv en PHP. Les amis qui en ont besoin peuvent s'y référer

Aujourd'hui, je souhaite principalement écrire une méthode pour importer des fichiers csv en PHP. En fait, je l'ai beaucoup cherché en ligne. Tout peut être mis en œuvre comment importer. Mais j'ai rencontré deux problèmes lors de l'importation. Le premier était que le test présentait des caractères tronqués lors de l'écriture du code sous Windows, puis le problème a été résolu. La seconde est que lorsqu'il a été soumis au système Linux, des caractères tronqués sont apparus à nouveau. Au début, je ne connaissais pas la raison du code tronqué. Au début, j'ai pensé que c'était une erreur dans la soumission du code svn. Finalement, j'ai posé une question dans l'un de mes groupes. Il a dit qu'il avait rencontré une erreur de Windows. Lors de la soumission sous Linux, des erreurs se produisaient toujours au début. Plus tard, la cause s'est avérée être des caractères tronqués. Allons droit au but et voyons comment résoudre ces deux problèmes !

Le problème est résolu :

PHP lit le fichier csv, et le chinois n'est pas lisible sous Windows J'ai tout de suite pensé à une fonction mb_convert_encoding(); ($str, "UTF-8", "GBK"); Alors c'est tout. Bien sûr, vous pouvez également utiliser iconv(); pour définir iconv('GBK', "UTF-8//TRANSLIT//IGNORE", $str); ces deux fonctions peuvent résoudre le problème des caractères tronqués sous Windows ; .

Solution au deuxième problème :

PHP lit les fichiers csv, mais le chinois ne peut pas être lu sous Linux. J'ai trouvé la solution après Baidu et Google

Je viens de l'ajouter une ligne. de code setlocale(LC_ALL, 'zh_CN'); Oui, cela vous aveuglera les yeux. C'est aussi simple que cela, et si vous ne le saviez pas, vous pourriez passer beaucoup de temps à le comprendre.

Explication de la fonction PHP setlocale()

Définition et utilisation

La fonction setlocale() définit les informations régionales (informations régionales).

Les informations régionales sont la langue, la devise, l'heure et d'autres informations pour une zone géographique. Cette fonction renvoie les paramètres régionaux actuels, ou false en cas d'échec.

Les identifiants de région suivants sont couramment utilisés pour la collecte de données :

zh_CN GB2312 
en_US.UTF-8 UTF-8 
zh_TW BIG5 
zh_HK BIG5-HKSCS 
zh_TW.EUC-TW EUC-TW 
zh_TW.UTF-8 UTF-8 
zh_HK.UTF-8 UTF-8 
zh_CN.GBK GBK
Copier après la connexion

Par exemple,
utf-8 : setlocale(LC_ALL, 'en_US.UTF-8′ ) ;
Chinois simplifié : setlocale(LC_ALL, 'zh_CN');

La raison pour laquelle je vous parle de la fonction setlocale() est que lorsque j'ai importé le fichier csv dans le système Linux, les caractères étaient tronqués. s'est produit, y compris l'utilisation des fonctions mb_convert_encoding() et iconv() n'a pas réussi à résoudre le problème final. Enfin, j'ai ajouté cette phrase setlocale(LC_ALL, 'zh_CN'); devant le code au début de l'importation du fichier csv et cela s'est fait facilement. Ensuite, j'ai recherché des informations et j'ai découvert que la fonction fgetcsv() est sensible à. paramètres régionaux. Par exemple, si LANG est défini sur en_US.UTF-8, les fichiers codés sur un seul octet auront des erreurs de lecture, nous devons donc définir la culture. Spécialement partagé avec tout le monde.

J'ai également essayé le code suivant, mais je n'ai pas réussi à le faire fonctionner. Ce sont les paramètres d'en-tête pour générer des fichiers csv. Cela ne fonctionnera peut-être pas pour moi, mais cela pourrait fonctionner pour vous. J'ai donc réglé le problème et fait de mon mieux pour aider mes collègues qui rencontraient des caractères tronqués lors de l'importation de fichiers CSV, car il était vraiment difficile de gérer ce problème lorsqu'il n'y avait pas d'autre moyen. Tout le monde peut l'essayer ! Il y en a toujours un qui vous appartient.

<?php 
$csvContent="csvzero,csvone,csvtwo,csvthree,csvfour,csvfive"; 
header("Content-Type: application/vnd.ms-excel; charset=GB2312"); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment;filename=CSV数据.csv "); 
header("Content-Transfer-Encoding: binary "); 
$csvContent = iconv("utf-8","gb2312",$csvContent); 
echo $csvContent; 
exit; 
?>
Copier après la connexion

Regardons de plus près le code permettant à php d'importer des fichiers csv :

Une brève introduction aux deux fonctions,

Détecté par mb_detect_encoding () Codage de caractères, ou FALSE si le codage de la chaîne spécifiée ne peut pas être détecté.

La fonction fgetcsv() lit une ligne du pointeur de fichier et analyse le champ CSV. Similaire à fgets(), sauf que fgetcsv() analyse la ligne de lecture et trouve les champs au format CSV, puis renvoie un tableau contenant ces champs. fgetcsv() renvoie FALSE en cas d'erreur, y compris lorsque la fin du fichier est rencontrée.

Remarque : depuis PHP 4.3.5, le fonctionnement de fgetcsv() est sécurisé en termes de binaire.

Remarque : Les lignes vides du fichier CSV seront renvoyées sous forme de tableau contenant un seul champ nul et ne seront pas traitées comme une erreur.

Remarque : Cette fonction est sensible aux paramètres régionaux. Par exemple, si LANG est défini sur en_US.UTF-8, les fichiers codés sur un seul octet auront des erreurs de lecture.

Remarque : Si vous constatez que PHP ne peut pas reconnaître les caractères de fin de ligne des fichiers Macintosh lors de la lecture de fichiers, vous pouvez activer l'option de configuration d'exécution auto_detect_line_endings.

<?php 
setlocale(LC_ALL, &#39;zh_CN&#39;); //设置地区信息(地域信息) 
$file = $_FILES[&#39;files&#39;]; 
$file_type = substr(strstr($file[&#39;name&#39;],&#39;.&#39;),1); 
if ($file_type != &#39;csv&#39;){ 
echo "<script type=\"text/javascript\">alert(\"文件格式错误,请重新上传!\"); </script>"; 
exit; 
} 
$handle = fopen($file[&#39;tmp_name&#39;],"r"); 
$file_encoding = mb_detect_encoding($handle); 
if ($file_encoding != &#39;ASCII&#39;){ 
echo "<script type=\"text/javascript\">alert(\"文件编码错误,请重新上传!\"); </script>"; 
exit; 
} 
$row = 0; 
$str=""; 
$sy=""; 
while ($data = fgetcsv($handle,1000,&#39;,&#39;)){ 
$row++; 
if ($row == 0) 
continue; 
$num = count($data); 
for ($i=0; $i<$num; $i++){ 
$str = (string)$data[$i].&#39;|&#39;; 
$str = mb_convert_encoding($str, "UTF-8", "GBK"); //已知源码为GBK,转换为utf-8 
$sy .= $str; //我这里做的比较复杂,是用&#39;|&#39;将csv文件里面的内容用&#39;|&#39;全部拼起来,因为我导入的是商品信息,需要根据用户需 
//要导入的数据去定义哪些数据是需要导入的。 
} 
} 
if ($sy) { $sy = rtrim($sy, &#39;|&#39;); } 
$arr = explode(&#39;|&#39;,$sy); 
$key = array_slice($arr,0,$num); //这个数组就是csv文件里面标题,就是商品id,标题,卖点等等的数据 
$skey = array(); 
$length = array(); 
$co = count($arr); 
$p = $co/$num; //求出要取出的数据的长度 
for($j=0;$j<$p;$j++){ 
$offset=($j-1)*$num; //偏移量,就像分页一样,我这里根据偏移量取出的一个数组就是一个商品的信息。 
if($j==0){ 
$length[] = array_slice($arr,0,$num); 
}else{ 
$length[] = array_slice($arr,$num+$offset,$num);//取出有哪些字段和商品 
} 
} 
$arrtitle = array(); 
$arrfileds = array(); 
$arrtagname = DB::select(&#39;字段标识&#39;, &#39;字段名称&#39;)->from(&#39;字段表&#39;)->fetch_all(); 
foreach ($arrtagname as $value) { 
$arrfileds[$value[&#39;fileds_tags&#39;]] = $value[&#39;fileds_name&#39;]; 
} 
foreach ($fileds as $v) 
{ 
$temarr= explode(&#39;-&#39;, $v); 
if (isset($temarr[0]) && !empty($temarr[0])) { 
if (isset($temarr[1]) && !empty($temarr[1])) { 
if ($temarr[1] == &#39;wenben&#39;) { 
$arrtitle[] = $arrfileds[$temarr[0]].&#39;文本&#39;; 
} 
} else { 
if ($temarr[0] != &#39;pic&#39;) { //是取出字段是图片就给去掉 
$arrtitle[] = $arrfileds[$temarr[0]]; 
} 
} 
} 
} 
$skey = array(); 
$order = array(); 
$order[] = &#39;act_tag&#39;; 
$order[] = &#39;channel_tag&#39;; 
$order[] = &#39;created_time&#39;; 
$order[] = &#39;orderby&#39;; 
$rows =&#39;&#39;; 
$f = $co/$num;//求出有多少件商品 
for($p=0;$p<count($arrtitle);$p++){ 
//这里就是根据自己的需求查出自己需要的数据,通过用户需要的商品字段标识查出表里相对应的英文标识。 
$skey[]= DB::select(&#39;字段标识&#39;)->from(&#39;字段表&#39;)->where(&#39;字段名称&#39;, &#39;=&#39;, $arrtitle[$p])->fetch_row(); 
$rows .= $skey[$p][&#39;字段标识&#39;].&#39;|&#39;; 
} 
if($rows){ $rows = rtrim($rows,&#39;|&#39;); } 
if(!empty($rows)){ $exrows = explode(&#39;|&#39;,$rows); }else{ $exrows = array(); } 
$skeys = array_merge($order,$exrows); 
$count1 = count($skeys); //字段的个数 
if(!empty($length)){ 
for($x=1;$x<$f;$x++){ //求出有多少件商品就的循环多少次 
$orders = array(); 
$orders[] = $act_tag; 
$orders[] = $channel_tag; 
$orders[] = time(); 
$newlen = array_merge($orders,$length[$x]); 
if($count1 !== count($newlen)){ //如果商品字段的长度和商品的长度不等就证明用户有哪个字段没录入 
$newrs = array(); 
echo "<script type=\"text/javascript\">alert(\"<font color=#f00;>".&#39;请检查第,&#39;.($x-1).&#39;件商品!&#39;.&#39;导入失败!&#39;."</font>"); </script>"; 
fclose($handle); 
exit(); 
}else{ //start 
$arrimport = array_combine($skeys,$newlen); //如果两个数组是相等的我就合并数组,并把导入csv里面的日期改为时间戳存储到数据库 
if(!empty($arrimport[&#39;start_time&#39;])){ $sta = strtotime($arrimport[&#39;start_time&#39;]); }else{ $sta=(int)0; } 
if(!empty($arrimport[&#39;end_time&#39;])){ $end = strtotime($arrimport[&#39;end_time&#39;]); }else{ $end=(int)0; } 
$arrtime=array(&#39;start_time&#39;=>$sta,&#39;end_time&#39;=>$end); 
if(!empty($arrimport[&#39;start_time&#39;]) && !empty($arrimport[&#39;end_time&#39;])){ 
$newrs=array_merge($arrimport,$arrtime); 
}else{ 
$newrs = array(); 
echo "<script type=\"text/javascript\">alert(\"<font color=#f00;>".&#39;请检查第,&#39;.($x-1).&#39;件商品!&#39;.&#39;导入失败!&#39;."</font>"); </script>"; 
fclose($handle); 
exit(); 
} 
if(count($skeys) == count($newrs)){ 
DB::insert(&#39;商品表&#39;, array_values($skeys)) 
->values(array_values($newrs)) 
->execute(); 
} 
} //end 
} 
} 
if($row-1==(int)0){ 
echo "<script type=\"text/javascript\">alert(\"<font color=#f00;>".&#39;您导入的商品为空!&#39;."</font>"); </script>"; 
}else{ 
echo "<script type=\"text/javascript\">alert(\"<font color=#f00;>".&#39;成功导入&#39;."<font color=#f00;>".($row-1)."</font>".&#39;件商品!&#39;."</font>"); 
} 
fclose($handle); 
} 
?>
Copier après la connexion

Ce qui précède est le processus d'importation CSV que je dois effectuer pour mon travail. Il peut être différent de votre méthode d'importation, mais certains codes vous seront toujours utiles !

Ce qui suit est une simple importation :

<form enctype="multipart/form-data" action="import.php" method="POST"> 
导入模板 
<label for="文件选择">文件选择:</label><input name="csv_goods" type="file" /> 
<input type="submit" value="导入" name="import" /> 
</form> 
<?php 
if (isset($_POST[&#39;import&#39;])){ 
$file = $_FILES[&#39;csv_goods&#39;]; 
$file_type = substr(strstr($file[&#39;name&#39;],&#39;.&#39;),1); 
// 检查文件格式 
if ($file_type != &#39;csv&#39;){ 
echo &#39;文件格式不对,请重新上传!&#39;; 
exit; 
} 
$handle = fopen($file[&#39;tmp_name&#39;],"r"); 
$file_encoding = mb_detect_encoding($handle); 
// 检查文件编码 
if ($file_encoding != &#39;ASCII&#39;){ 
echo &#39;文件编码错误,请重新上传!&#39;; 
exit; 
} 
$row = 0; 
while ($data = fgetcsv($handle,1000,&#39;,&#39;)){ 
//echo "<font color=red>$row</font>"; //可以知道总共有多少行 
$row++; 
if ($row == 1) 
continue; 
$num = count($data); 
// 这里会依次输出每行当中每个单元格的数据 
for ($i=0; $i<$num; $i++){ 
echo $data[$i]."<br>"; 
// 在这里对数据进行处理 
} 
} 
fclose($handle); 
} 
?>
Copier après la connexion

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. Pour en savoir plus. contenu connexe, veuillez faire attention à PHP Chinese net !

Recommandations associées :

Introduction au traitement php de l'interception de chaînes chinoises (mb_substr) et obtention du nombre de caractères dans les chaînes chinoises

Introduction à l'interface d'appel curl encapsulée PHP et aux fonctions communes

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre les numéros de page de mots tronqués Comment résoudre les numéros de page de mots tronqués Jun 25, 2023 pm 03:23 PM

Solution aux numéros de page de mots tronqués : 1. Ouvrez le document Word et cliquez sur l'option « Fichier » dans le coin supérieur gauche ; 2. Sélectionnez l'option « Plus », puis cliquez sur le bouton « Options » 3. Sélectionnez « Avancé » ; dans les options de mots ; 4. Recherchez "Afficher les codes de champ au lieu des valeurs de champ" dans "Afficher le contenu du document", décochez le devant et cliquez sur OK pour revenir à la page d'accueil.

Comment résoudre les caractères chinois tronqués sous Linux Comment résoudre les caractères chinois tronqués sous Linux Feb 21, 2024 am 10:48 AM

Le problème du chinois tronqué sous Linux est un problème courant lors de l'utilisation de jeux de caractères et d'encodages chinois. Les caractères tronqués peuvent être causés par des paramètres de codage de fichier incorrects, des paramètres régionaux du système non installés ou définis, des erreurs de configuration de l'affichage du terminal, etc. Cet article présentera plusieurs solutions de contournement courantes et fournira des exemples de code spécifiques. 1. Vérifiez le paramètre d'encodage du fichier. Utilisez la commande file pour afficher l'encodage du fichier. Utilisez la commande file dans le terminal pour afficher l'encodage du fichier : file-ifilename S'il y a "charset" dans la sortie.

Comment résoudre le code tronqué du démarrage de Tomcat Comment résoudre le code tronqué du démarrage de Tomcat Dec 26, 2023 pm 05:21 PM

Solutions au démarrage tronqué de Tomcat : 1. Modifiez le fichier de configuration de Tomcat ; 2. Modifiez la langue du système ; 3. Modifiez l'encodage de la fenêtre de ligne de commande ; 4. Vérifiez la configuration du serveur Tomcat ; fichier ; 7, essayez d’autres solutions. Introduction détaillée : 1. Modifiez le fichier de configuration conf de Tomcat, ouvrez le répertoire conf de Tomcat, recherchez le fichier "logging.properties", etc.

Comment résoudre le problème des caractères chinois tronqués dans Windows 10 Comment résoudre le problème des caractères chinois tronqués dans Windows 10 Jan 16, 2024 pm 02:21 PM

Dans le système Windows 10, les caractères tronqués sont courants. La raison derrière cela est souvent que le système d'exploitation ne fournit pas de prise en charge par défaut pour certains jeux de caractères, ou qu'il y a une erreur dans les options de jeu de caractères définies. Afin de prescrire le bon médicament, nous analyserons en détail ci-dessous les procédures opératoires réelles. Comment résoudre le code tronqué de Windows 10 1. Ouvrez les paramètres et recherchez « Heure et langue » 2. Recherchez ensuite « Langue » 3. Recherchez « Gérer les paramètres de langue » 4. Cliquez sur « Modifier les paramètres régionaux du système » ici 5. Vérifiez comme indiqué et cliquez sur Assurez-vous juste.

Que faire si le terminal Linux contient des caractères chinois tronqués Que faire si le terminal Linux contient des caractères chinois tronqués Mar 16, 2023 am 09:20 AM

Solution aux caractères chinois tronqués dans Linux tty : 1. Téléchargez la police fbterm via la commande « sudo apt-get install fbterm » ; 2. Exécutez la commande « sudo fbterm » 3. Changez la police et la taille de la police en « font-names » ; =Ubuntu Mono font-size=14” suffit.

Comment résoudre le problème des caractères tronqués dans les documents du système Win11 Comment résoudre le problème des caractères tronqués dans les documents du système Win11 Jun 29, 2023 pm 06:29 PM

Comment résoudre le problème des documents texte tronqués dans Win11 ? De nombreux utilisateurs ont des documents texte tronqués lorsqu'ils utilisent le système Win11 et ne peuvent pas les lire normalement. De nombreux amis ne savent pas comment résoudre ce problème. En fait, cette méthode n'est pas difficile. Ci-dessous, l'éditeur a compilé les étapes pour résoudre le problème des documents système Windows 11 tronqués. J'espère que cela pourra vous inspirer ! Étapes pour résoudre les documents système Windows 11 tronqués : 1. Tout d'abord, ouvrez le panneau de configuration de win11, entrez le panneau de configuration dans la zone de recherche ci-dessous, puis cliquez sur Rechercher pour accéder au panneau de configuration. 2. Après être entré dans le panneau, recherchez l'horloge et la zone et cliquez pour entrer, puis cliquez sur l'option de zone. 3. Après avoir entré, cliquez sur le panneau de gestion, puis cliquez sur Modifier les paramètres régionaux du système.

Méthode d'édition pour résoudre le problème des caractères tronqués lors de l'ouverture de fichiers dll Méthode d'édition pour résoudre le problème des caractères tronqués lors de l'ouverture de fichiers dll Jan 06, 2024 pm 07:53 PM

Lorsque de nombreux utilisateurs utilisent des ordinateurs, ils constateront qu'il existe de nombreux fichiers avec le suffixe dll, mais de nombreux utilisateurs ne savent pas comment ouvrir de tels fichiers. Pour ceux qui veulent savoir, veuillez consulter les détails suivants. pour ouvrir et modifier les fichiers dll : 1. Téléchargez un logiciel appelé "exescope", puis téléchargez-le et installez-le. 2. Cliquez ensuite avec le bouton droit sur le fichier dll et sélectionnez "Modifier les ressources avec exescope". 3. Cliquez ensuite sur « OK » dans la boîte de dialogue d'erreur contextuelle. 4. Ensuite, sur le panneau de droite, cliquez sur le signe « + » devant chaque groupe pour afficher le contenu qu'il contient. 5. Cliquez sur le fichier dll que vous souhaitez afficher, puis cliquez sur « Fichier » et sélectionnez « Exporter ». 6. Ensuite, vous pouvez

Résolvez le problème des caractères tronqués dans le bloc-notes Win11 Résolvez le problème des caractères tronqués dans le bloc-notes Win11 Jan 05, 2024 pm 03:11 PM

Certains amis veulent ouvrir un bloc-notes et constatent que leur bloc-notes Win11 est tronqué et ne savent pas quoi faire. En fait, il suffit généralement de modifier la région et la langue. Le Bloc-notes Win11 est tronqué : Première étape, utilisez la fonction de recherche, recherchez et ouvrez le "Panneau de configuration". Deuxième étape, cliquez sur "Modifier le format de la date, de l'heure ou des nombres" sous Horloge et région. Troisième étape, cliquez sur l'option "Gérer". au-dessus de la carte. La quatrième étape consiste à cliquer sur « Modifier les paramètres régionaux du système » ci-dessous. La cinquième étape consiste à modifier les paramètres régionaux actuels du système en « Chinois (simplifié, Chine) » et à cliquer sur « OK » pour enregistrer.

See all articles