fgetcsv ()는 줄의 시작 부분에있을 때 특수 문자를 무시합니다!

StackOverflow https://stackoverflow.com/questions/2238971

  •  19-09-2019
  •  | 
  •  

문제

CSV 파일을 받아들이고 모든 행을 배열로 읽는 간단한 스크립트가 있습니다. 그런 다음 첫 번째 행의 각 열을 순환하고 (내 경우에는 설문 조사의 질문을 보유하고 있음) 인쇄합니다. 설문 조사는 프랑스어로되어 있으며 질문의 첫 번째 특성이 특별한 캐릭터 (é, ê, Ç 등) 일 때마다 fgetcsv는 단순히 그것을 생략합니다.

값 중간의 특수 문자는 첫 번째 캐릭터 일 때만 영향을받지 않습니다.

나는 이것을 디버깅하려고했지만 당황 스럽다. 파일의 내용으로 var_dump를했고 문자는 분명히 있습니다.

var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));

그리고 여기 내 코드가 있습니다.

if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
    {
        $csv_arr = array();

        //Populate an array with all the cells of the CSV file
        while(!feof($csv))
        {
            $csv_arr[] = fgetcsv($csv);
        }

        //Close the file, no longer needed
        fclose($csv);

        // This should cycle through the cells of the first row (questions)
        foreach($csv_arr[0] as $question)
        {
            echo utf8_encode($question) . "<br />";
        }

    }
도움이 되었습니까?

해결책

이미 체크 아웃 했습니까? fgetcsv의 수동 페이지? 그 구체적인 문제에 대해서는 아무 말도하지 않지만 여기에 아무것도 나오지 않으면 많은 기여를 할 가치가 있습니다.

예를 들어 다음과 같습니다.

참고 :이 기능으로 로케일 설정이 고려됩니다. Lang이 예를 들어 EN_US.UTF-8 인 경우 1 바이트 인코딩의 파일은이 기능으로 잘못 읽습니다.

또한 항상 줄의 시작 부분에있는 것처럼 보이면 이것이 실제로 숨겨진 라인 브레이크 문제 일 수 있습니까? 이거 있어요 :

참고 : Macintosh 컴퓨터에서 파일을 읽거나 작성할 때 PHP가 라인 엔딩을 제대로 인식하지 못하는 경우 Auto_detect_line_endings 런타임 구성 옵션을 사용하면 문제를 해결하는 데 도움이 될 수 있습니다.

라인 결말이 다른 파일을 저장하려고 할 수도 있습니다.

다른 팁

전화하기 전에 로케일을 올바르게 설정하고 있습니까? fgetcsv()?

setlocale(LC_ALL, 'fr_FR.UTF-8');

그렇지 않으면, fgetcsv() 다중 바이트 안전하지 않습니다.

사용 가능한 로케일 목록에 나타나는 것으로 설정해야합니다. Linux에서 (확실히 데비안에서) 당신은 그렇게함으로써 이것을 볼 수 있습니다.

locale -a

당신은 같은 것을 받아야합니다 ...

C
en_US.utf8
POSIX

UTF8 지원의 경우 끝에 UTF8과 인코딩을 선택하십시오. 입력이 다른 것으로 인코딩 된 경우 적절한 로케일을 사용해야하지만 OS가 먼저 지원해야합니다.

로케일을 시스템에서 사용할 수없는 로케일로 설정하면 도움이되지 않습니다.

이 행동에는 a 버그 보고서 그것을 위해 제출했지만 분명히 버그가 아닙니다.

우리는 같은 결과를 보았습니다 LANG 로 설정 C, 그러한 값이 인용 표시로 래핑되도록함으로써 그 주위를 해결했습니다. 예를 들어, 라인

a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"

통과 할 때 다음 배열을 생성합니다 fgetcsv():

array (
  0 => 'a',
  1 => 'a',
  2 => '',
  3 => 'é',
  4 => '',
  5 => 'óú',
  6 => '&ú',
  7 => 'ó&ú',
)

물론, 값을 두 배로 늘려서 따옴표를 피해야하지만, 누락 된 캐릭터를 수리하는 것보다 번거롭지 않습니다.

이상하게도, 이것은 입력 파일의 UTF-8 및 CP1252 인코딩에서 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top