csv 파일을 PHP로 가져올 때 문자가 깨지는 문제를 해결하는 방법
이 글은 주로 PHP에서 CSV 파일을 가져올 때 문자가 깨지는 문제에 대한 해결책을 소개합니다. 필요한 친구들은 참고하면 됩니다.
오늘은 주로 PHP에서 CSV 파일을 가져오는 방법을 작성하고 싶습니다. 온라인 검색이 많다. 가져오는 방법을 모두 구현할 수 있습니다. 하지만 가져올 때 두 가지 문제가 발생했습니다. 하나는 Windows에서 코드를 작성할 때 테스트에서 문자가 깨져서 해결되었다는 것입니다. 두 번째는 리눅스 시스템에 제출했을 때 문자 깨짐 현상이 다시 발생했다는 것입니다. 처음에는 코드가 왜곡되는 이유를 몰랐습니다. 처음에는 코드 svn 제출에 오류가 있는 줄 알았습니다. 결국 내 그룹 중 하나에 질문을 했습니다. Windows에서 svn 제출 시 오류가 발생했다고 하더군요. Linux에 제출할 때 처음에는 항상 오류가 발생했는데 나중에는 문자가 깨져서 발생하는 것으로 밝혀졌습니다. 본론으로 들어가 이 두 가지 문제를 해결하는 방법을 살펴보겠습니다!
문제가 해결되었습니다:
php는 csv 파일을 읽고 Windows에서는 중국어를 읽을 수 없습니다. 나는 즉시 다음과 같은 설정을 하는 mb_convert_encoding() 함수를 생각했습니다. $str = mb_convert_encoding($str, "UTF-8 ", "GBK") 그리고 그게 다입니다. 물론 iconv();를 사용하여 다음과 같이 iconv('GBK',"UTF-8//TRANSLIT//IGNORE",$str);을 설정하여 Windows에서 문자가 깨지는 문제를 해결할 수도 있습니다.
문제 2에 대한 해결책:
PHP는 csv 파일을 읽지만 Linux에서는 중국어를 읽을 수 없습니다. Baidu와 Google 이후에 해결책을 찾았습니다.
코드 한 줄을 추가하는 것입니다. setlocale(LC_ALL, 'zh_CN'); , 그것은 당신을 눈이 멀게합니다. 그것은 매우 간단하며, 모르면 그것을 알아내는데 많은 시간을 소비할 수 있습니다.
PHP setlocale() 함수 설명
정의 및 사용법
setlocale() 함수는 지역 정보(지역 정보)를 설정합니다.
지역정보는 지리적 영역에 대한 언어, 통화, 시간 및 기타 정보입니다. 이 함수는 현재 로케일을 반환하거나, 실패하면 false를 반환합니다.
다음은 데이터 수집에 일반적으로 사용되는 지역 식별자입니다.
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
예:
utf-8: setlocale(LC_ALL, 'en_US.UTF-8′)
중국어 간체: setlocale(LC_ALL, 'zh_CN') ;
setlocale() 함수에 대해 말씀드리는 이유는 csv 파일을 Linux 시스템으로 가져올 때 mb_convert_encoding() 및 iconv() 함수를 사용해도 해결되지 않았기 때문입니다. 마지막 문제. 마지막으로 csv 파일 가져오기 시작 부분에 코드 앞에 setlocale(LC_ALL, 'zh_CN');이라는 문장을 추가했는데 쉽게 완료되었습니다. 그런 다음 정보를 검색해 보니 fgetcsv() 함수가 로케일 설정. 예를 들어 LANG이 en_US.UTF-8로 설정된 경우 단일 바이트로 인코딩된 파일에는 읽기 오류가 있으므로 문화권을 설정해야 합니다. 모든 사람과 특별히 공유됩니다.
다음 코드도 시도했지만 작동하지 못했습니다. csv 파일 생성을 위한 헤더 설정입니다. 나에게는 효과가 없을 수도 있지만 당신에게는 효과가 있을 수도 있습니다. 그래서 정리하고 csv 파일을 가져올 때 글자가 깨져 보이는 동료들을 돕기 위해 최선을 다했습니다. 다른 방법이 없을 때는 처리하기가 정말 어려웠기 때문입니다. 누구나 시도해 볼 수 있습니다! 항상 당신에게 속한 것이 있습니다.
<?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; ?>
PHP가 csv 파일을 가져오는 코드를 자세히 살펴보겠습니다.
두 함수에 대한 간략한 소개,
mb_Detect_encoding()은 문자 인코딩이 감지되거나 지정된 문자열의 인코딩이 감지되면 FALSE를 반환합니다. 감지할 수 없습니다.
fgetcsv() 함수는 파일 포인터에서 한 줄을 읽고 CSV 필드를 구문 분석합니다. fgetcsv()가 읽기 행을 구문 분석하고 CSV 형식의 필드를 찾은 다음 해당 필드가 포함된 배열을 반환한다는 점을 제외하면 fgets()와 유사합니다. fgetcsv()는 파일의 끝을 발견할 때를 포함하여 오류가 발생하면 FALSE를 반환합니다.
참고: PHP 4.3.5부터 fgetcsv() 작업은 바이너리 안전합니다.
참고: CSV 파일의 빈 줄은 단일 null 필드를 포함하는 배열로 반환되며 오류로 처리되지 않습니다.
참고: 이 기능은 로케일 설정에 민감합니다. 예를 들어 LANG이 en_US.UTF-8로 설정된 경우 단일 바이트로 인코딩된 파일에는 읽기 오류가 발생합니다.
참고: 파일을 읽을 때 PHP가 Macintosh 파일의 줄 끝 문자를 인식할 수 없는 경우 auto_Detect_line_endings 런타임 구성 옵션을 활성화할 수 있습니다.
<?php setlocale(LC_ALL, 'zh_CN'); //设置地区信息(地域信息) $file = $_FILES['files']; $file_type = substr(strstr($file['name'],'.'),1); if ($file_type != 'csv'){ echo "<script type=\"text/javascript\">alert(\"文件格式错误,请重新上传!\"); </script>"; exit; } $handle = fopen($file['tmp_name'],"r"); $file_encoding = mb_detect_encoding($handle); if ($file_encoding != 'ASCII'){ echo "<script type=\"text/javascript\">alert(\"文件编码错误,请重新上传!\"); </script>"; exit; } $row = 0; $str=""; $sy=""; while ($data = fgetcsv($handle,1000,',')){ $row++; if ($row == 0) continue; $num = count($data); for ($i=0; $i<$num; $i++){ $str = (string)$data[$i].'|'; $str = mb_convert_encoding($str, "UTF-8", "GBK"); //已知源码为GBK,转换为utf-8 $sy .= $str; //我这里做的比较复杂,是用'|'将csv文件里面的内容用'|'全部拼起来,因为我导入的是商品信息,需要根据用户需 //要导入的数据去定义哪些数据是需要导入的。 } } if ($sy) { $sy = rtrim($sy, '|'); } $arr = explode('|',$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('字段标识', '字段名称')->from('字段表')->fetch_all(); foreach ($arrtagname as $value) { $arrfileds[$value['fileds_tags']] = $value['fileds_name']; } foreach ($fileds as $v) { $temarr= explode('-', $v); if (isset($temarr[0]) && !empty($temarr[0])) { if (isset($temarr[1]) && !empty($temarr[1])) { if ($temarr[1] == 'wenben') { $arrtitle[] = $arrfileds[$temarr[0]].'文本'; } } else { if ($temarr[0] != 'pic') { //是取出字段是图片就给去掉 $arrtitle[] = $arrfileds[$temarr[0]]; } } } } $skey = array(); $order = array(); $order[] = 'act_tag'; $order[] = 'channel_tag'; $order[] = 'created_time'; $order[] = 'orderby'; $rows =''; $f = $co/$num;//求出有多少件商品 for($p=0;$p<count($arrtitle);$p++){ //这里就是根据自己的需求查出自己需要的数据,通过用户需要的商品字段标识查出表里相对应的英文标识。 $skey[]= DB::select('字段标识')->from('字段表')->where('字段名称', '=', $arrtitle[$p])->fetch_row(); $rows .= $skey[$p]['字段标识'].'|'; } if($rows){ $rows = rtrim($rows,'|'); } if(!empty($rows)){ $exrows = explode('|',$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;>".'请检查第,'.($x-1).'件商品!'.'导入失败!'."</font>"); </script>"; fclose($handle); exit(); }else{ //start $arrimport = array_combine($skeys,$newlen); //如果两个数组是相等的我就合并数组,并把导入csv里面的日期改为时间戳存储到数据库 if(!empty($arrimport['start_time'])){ $sta = strtotime($arrimport['start_time']); }else{ $sta=(int)0; } if(!empty($arrimport['end_time'])){ $end = strtotime($arrimport['end_time']); }else{ $end=(int)0; } $arrtime=array('start_time'=>$sta,'end_time'=>$end); if(!empty($arrimport['start_time']) && !empty($arrimport['end_time'])){ $newrs=array_merge($arrimport,$arrtime); }else{ $newrs = array(); echo "<script type=\"text/javascript\">alert(\"<font color=#f00;>".'请检查第,'.($x-1).'件商品!'.'导入失败!'."</font>"); </script>"; fclose($handle); exit(); } if(count($skeys) == count($newrs)){ DB::insert('商品表', array_values($skeys)) ->values(array_values($newrs)) ->execute(); } } //end } } if($row-1==(int)0){ echo "<script type=\"text/javascript\">alert(\"<font color=#f00;>".'您导入的商品为空!'."</font>"); </script>"; }else{ echo "<script type=\"text/javascript\">alert(\"<font color=#f00;>".'成功导入'."<font color=#f00;>".($row-1)."</font>".'件商品!'."</font>"); } fclose($handle); } ?>
위는 작업에 필요한 csv 가져오기 프로세스입니다. 가져오기 방법에 따라 다를 수 있지만 일부 코드는 항상 도움이 될 것입니다!
다음은 간단한 가져오기입니다.
<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['import'])){ $file = $_FILES['csv_goods']; $file_type = substr(strstr($file['name'],'.'),1); // 检查文件格式 if ($file_type != 'csv'){ echo '文件格式不对,请重新上传!'; exit; } $handle = fopen($file['tmp_name'],"r"); $file_encoding = mb_detect_encoding($handle); // 检查文件编码 if ($file_encoding != 'ASCII'){ echo '文件编码错误,请重新上传!'; exit; } $row = 0; while ($data = fgetcsv($handle,1000,',')){ //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); } ?>
위 내용은 모든 사람의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 주목하세요!
관련 권장 사항:
PHP 처리 중국어 문자열 가로채기(mb_substr) 및 중국어 문자열의 문자 수 가져오기 소개
위 내용은 csv 파일을 PHP로 가져올 때 문자가 깨지는 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











잘못된 단어 페이지 번호에 대한 해결 방법: 1. 단어 문서를 열고 왼쪽 상단에 있는 "파일" 옵션을 클릭합니다. 2. "추가" 옵션을 선택한 다음 "옵션" 버튼을 클릭합니다. 4. "문서 내용 표시"에서 "필드 값 대신 필드 코드 표시"를 찾아 앞에 있는 확인 표시를 제거한 후 확인을 클릭하여 홈 페이지로 돌아갑니다.

Linux 중국어 왜곡 문제는 중국어 문자 세트 및 인코딩을 사용할 때 흔히 발생하는 문제입니다. 잘못된 파일 인코딩 설정, 시스템 로케일이 설치 또는 설정되지 않음, 터미널 디스플레이 구성 오류 등으로 인해 문자가 깨질 수 있습니다. 이 문서에서는 몇 가지 일반적인 해결 방법을 소개하고 특정 코드 예제를 제공합니다. 1. 파일 인코딩 설정을 확인하십시오. 파일 인코딩을 보려면 터미널에서 file 명령을 사용하십시오. 출력에 "charset"이 있는 경우.

잘못된 Tomcat 시작에 대한 해결 방법: 1. Tomcat의 conf 구성 파일 수정 2. 명령줄 창 인코딩 수정 4. Tomcat 서버 구성 확인 6. 로그 확인 파일 7, 다른 해결 방법을 시도해 보세요. 자세한 소개: 1. Tomcat의 conf 구성 파일을 수정하고, Tomcat의 conf 디렉터리를 열고, "logging.properties" 파일을 찾습니다.

Windows 10 시스템에서는 잘못된 문자가 일반적입니다. 그 이유는 종종 운영 체제가 일부 문자 집합에 대해 기본 지원을 제공하지 않거나 문자 집합 옵션 설정에 오류가 있기 때문입니다. 올바른 약을 처방하기 위해 실제 수술 과정을 아래에서 자세히 분석해 보겠습니다. Windows 10 잘못된 코드를 해결하는 방법 1. 설정을 열고 "시간 및 언어"를 찾습니다. 2. 그런 다음 "언어"를 찾습니다. 3. "언어 설정 관리"를 찾습니다. 4. 여기에서 "시스템 지역 설정 변경"을 클릭합니다. 5. 표시된 대로 확인하고 클릭합니다. 그냥 확인하세요.

Linux tty의 중국어 문자 문제 해결 방법: 1. "sudo apt-get install fbterm" 명령을 통해 fbterm 글꼴을 다운로드합니다. 2. "sudo fbterm" 명령을 실행합니다. 3. 글꼴 및 글꼴 크기를 "font-names"로 변경합니다. =Ubuntu Mono 글꼴- 크기=14”이면 충분합니다.

win11에서 텍스트 문서가 왜곡되는 문제를 해결하는 방법은 무엇입니까? 많은 사용자가 win11 시스템을 사용하면 텍스트 문서가 깨져서 정상적으로 읽을 수 없습니다. 많은 친구들이 이 문제를 해결하는 방법을 모릅니다. 사실 이 방법은 어렵지 않습니다. 아래에서 편집자는 Windows 11 시스템 문서가 왜곡된 문제를 해결하는 단계를 정리했습니다. 이것이 여러분에게 영감을 줄 수 있기를 바랍니다. 왜곡된 Windows 11 시스템 문서를 해결하는 단계: 1. 먼저 win11의 제어판을 열고 아래 검색 상자에 제어판을 입력한 후 검색을 클릭하여 제어판에 들어갑니다. 2. 패널 진입 후 시계와 지역을 찾아 클릭하여 진입한 후 지역 옵션을 클릭하세요. 3. 입력 후 관리 패널을 클릭한 후 시스템 지역 설정 변경을 클릭합니다.

많은 사용자가 컴퓨터를 사용할 때 접미사 dll이 포함된 파일이 많이 있지만 이러한 파일을 여는 방법을 모르는 사용자가 많다는 것을 알게 될 것입니다. 알고 싶은 사용자는 다음 세부 정보를 살펴보십시오. 튜토리얼~열기 방법 dll 파일 편집: 1. "exescope"라는 소프트웨어를 다운로드하여 설치합니다. 2. 그런 다음 dll 파일을 마우스 오른쪽 버튼으로 클릭하고 "exescope로 리소스 편집"을 선택합니다. 3. 그런 다음 팝업 오류 프롬프트 상자에서 "확인"을 클릭하십시오. 4. 그런 다음 오른쪽 패널에서 각 그룹 앞에 있는 "+" 기호를 클릭하면 해당 그룹에 포함된 콘텐츠를 볼 수 있습니다. 5. 보려는 dll 파일을 클릭한 다음 "파일"을 클릭하고 "내보내기"를 선택합니다. 6. 그러면 할 수 있다

일부 친구는 메모장을 열고 싶어하는데 win11 메모장이 깨져서 무엇을 해야 할지 모릅니다. 실제로 우리는 일반적으로 지역과 언어만 수정하면 됩니다. Win11 메모장이 깨졌습니다. 첫 번째 단계에서는 검색 기능을 사용하여 "제어판"을 검색하고 엽니다. 두 번째 단계에서는 시계 및 지역 아래에서 "날짜, 시간 또는 숫자 형식 변경"을 클릭합니다. 세 번째 단계에서는 카드 위의 "관리" 옵션을 클릭합니다. 네 번째 단계는 아래의 "시스템 지역 설정 변경"을 클릭하는 것입니다. 다섯 번째 단계는 현재 시스템 지역 설정을 "중국어(간체, 중국)"로 변경하고 "확인"을 클릭하여 저장하는 것입니다.
