FGETCSV () 는 PHP가 CSV 파일을 행으로 읽고 각 데이터 라인을 배열로 반환하기 위해 제공하는 편리한 기능입니다. 그러나 자동으로 트랜스 코드되지 않습니다. GBK 또는 BIG5 인코딩에 저장된 파일을 읽고 PHP 환경 또는 웹 페이지 출력이 UTF-8 인 경우 출력이 멍청하게 나타납니다.
Breadbled 문제를 해결하려면 원래 인코딩에서 각 데이터 행을 읽은 후 대상 인코딩 (일반적으로 UTF-8)으로 변환해야합니다. 이것은 일반적으로 php의 mb_convert_encoding () 또는 iconv () 함수를 통해 달성됩니다.
UTF-8으로 올바르게 표시하려는 GBK 인코딩 된 CSV 파일이 있다고 가정 해 봅시다. 다음 코드를 사용할 수 있습니다.
<코드> <? php $ filename = "data.csv"; // CSV 파일이 GBK 인코딩되었다고 가정합니다
$ hone = fopen ($ filename, "r");
if ($ hands! == false) {
while (($ data = fgetcsv ($ hands))! == false) {
// 각 열을 GBK에서 UTF-8로 변환합니다
foreach ($ data as & $ field) {
$ field = mb_convert_encoding ($ field, "utf-8", "gbk");
}
비 설정 ($ field); // 인용 문제를 피하십시오
print_r($data); // 트랜스 코딩 된 컨텐츠를 출력하십시오
}
fclose($handle);
} 또 다른 {
echo "파일을 열 수 없다 : $ filename";
}
?>
</코드>
파일의 원래 인코딩이 무엇인지 확실하지 않은 경우 mb_detect_encoding ()을 사용하여 자동으로 감지 할 수 있습니다.
<코드> <? php $ filename = "data.csv";
$ hone = fopen ($ filename, "r");
if ($ hands! == false) {
$ firstline = fgets ($ 핸들);
되감기 ($ 핸들); // 첫 번째 줄을 읽은 후 포인터는 파일의 시작 부분으로 돌아갑니다.
$ encoding = mb_detect_encoding ($ firstline, [ "gbk", "utf-8", "big5", "sjis"], true);
if (! $ encoding) {
$ encoding = "gbk"; // 감지 할 수없는 경우 GBK는 기본적으로 사용됩니다.
}
while (($data = fgetcsv($handle)) !== false) {
foreach ($data as &$field) {
$field = mb_convert_encoding($field, "UTF-8", $encoding);
}
unset($field);
print_r($data);
}
fclose($handle);
} 또 다른 {
echo "파일을 열 수 없습니다";
}
?>
</코드>
사용자가 업로드 한 CSV 파일이 다른 운영 체제 (Windows, Mac, Linux)에서 나올 수 있거나 다른 소프트웨어 (Excel, WPS)에 의해 저장 될 수있는 경우, 현재 문자 인코딩은 더욱 통제 할 수 없습니다. 업로드 후 인코딩을 균일하게 처리 한 다음 fgetcsv () 로 읽는 것이 좋습니다.
업로드 된 CSV 파일을 임시 파일로 저장하고 Unified Processing을위한 위의 자동 감지 + 트랜스 코딩 방법을 사용하는 것을 고려할 수 있습니다.
<코드> <? php if (isset ($ _ files [ 'csvfile']) && $ _files [ 'csvfile'] [ 'error'] === upload_err_ok) {
$ tmpfile = $ _files [ 'csvfile'] [ 'tmp_name'];
$ hone = fopen ($ tmpfile, "r");
if ($handle !== false) {
$firstLine = fgets($handle);
rewind($handle);
$encoding = mb_detect_encoding($firstLine, ["GBK", "UTF-8", "BIG5", "SJIS"], true);
if (!$encoding) {
$encoding = "GBK";
}
while (($data = fgetcsv($handle)) !== false) {
foreach ($data as &$field) {
$field = mb_convert_encoding($field, "UTF-8", $encoding);
}
unset($field);
print_r($data);
}
fclose($handle);
} else {
echo "업로드 된 파일을 읽을 수 없습니다";
}
} 또 다른 {
Echo "업로드 실패 또는 파일이 유효하지 않습니다";
}
?>
</코드>