fgetcsv ()는 줄의 시작 부분에있을 때 특수 문자를 무시합니다!
문제
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가 먼저 지원해야합니다.
로케일을 시스템에서 사용할 수없는 로케일로 설정하면 도움이되지 않습니다.
우리는 같은 결과를 보았습니다 LANG
로 설정 C
, 그러한 값이 인용 표시로 래핑되도록함으로써 그 주위를 해결했습니다. 예를 들어, 라인
a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"
통과 할 때 다음 배열을 생성합니다 fgetcsv()
:
array (
0 => 'a',
1 => 'a',
2 => '',
3 => 'é',
4 => '',
5 => 'óú',
6 => '&ú',
7 => 'ó&ú',
)
물론, 값을 두 배로 늘려서 따옴표를 피해야하지만, 누락 된 캐릭터를 수리하는 것보다 번거롭지 않습니다.
이상하게도, 이것은 입력 파일의 UTF-8 및 CP1252 인코딩에서 발생합니다.