2011-03-29 3 views
0

PHP에서 CSV 파일을 구문 분석하려고합니다. 내 문제는 다음과 같습니다. "é"또는 "í"로 표시된 필드가 있으면 파서는 필드 시작 부분에서 모든 문자를 가져옵니다.필드 시작 부분에 "é", "í"와 같은 문자를 사용하는 PHP csv 파서

문제는 내 호스트에서만 발생하며 XAAMP를 로컬로 사용하는 경우 (최신 PHP 버전) 문제가 없습니다. 버그가있는 호스트의 PHP 버전은 다음과 같습니다. 5.2.6-1 + lenny9

코드는 fgetcsv의 한 줄에 불과합니다.

while (($program = fgetcsv($handle, 0, ',', '"')) !== FALSE) {...} 

이 코드는 이미 print_r에서 볼 때 "먹은"버전을 출력합니다.

내가 할 수 있는게 있습니까? 그 이후로 수정 된 것은 PHP의 버그 일 것입니다. 내가 찾은 한 가지 대안은 필드 끝 부분에 쉼표를 붙임으로써 시퀀스를 벗어나는 것입니다 (내 CSV 소스, Google 스프레드 시트는 내부에있는 경우 자동으로 필드를 ""감싸줍니다). 그런 다음 쉼표 인 경우 마지막 문자를 삭제하는 함수를 작성할 수 있습니다 (이에 대한 도움말은 무엇입니까?).

PHP에서 알려진 버그입니까? (또는 그랬습니까?) 해결책이 있습니까? 그렇지 않다면 쉼표 기능이있는 마지막 문자 삭제 기능으로 나를 도울 수 있습니까?

+0

'print PHP_VERSION;'을 사용하여 찾을 수 있습니다. 그리고 시도 할 수있는 ['fgetcsv' 매뉴얼 페이지] (http://php.net/fgetcsv)에 다른 구현이 있습니다. – mario

+0

팁 주셔서 감사합니다, 그 : 5.2.6-1 + lenny9 – zsero

답변

0

실제 문제는 웹 서버가 멀티 바이트 문자셋을 금지하는 로켈에서 실행된다는 것입니다. C로 설정하면 나도 같은 결과를 얻을 : 필드에 éí

<?php print_r(str_getcsv("ée, íi, zz, bb, ")); 

$ LC_ALL=C php test_getcsv.php 

잘라냅니다. 나는이처럼 실행하면 [0] => e [1] => i [2] => zz

는하지만 :

$ LC_ALL=de_DE.UTF-8 php test_getcsv.php 

을 나는 정확한 결과를 얻을 수 있습니다. [0] => ée [1] => íi [2] => zz

서버에서 사용할 수있는 로케일을 조사한 다음 setlocale(LC_ALL, "xy_zz.UTF-8")을 스크립트 시작 부분에서 사용해야합니다.

+0

그것은 여전히 ​​작동하지 않습니다. 'setlocale (LC_ALL, "hu.UTF-8");'을 입력했습니다. 함수의 시작 부분에 있지만 차이는 없습니다. 헝가리 인이므로 지원해야합니다. 생성 된 오류가 없으면 setlocale이 허용된다는 의미입니까? 나는 hu_HU를 시도했다 .UTF-8하지만 차이는 없다. 지역이 수락되면 인쇄 할 방법이 있습니까? – zsero

+0

@zsero : 작동하지 않으면 지원되지 않을 가능성이 큽니다. 'setlocale()'의 리턴 문자열을 받아 들일 수 있는지'print' 할 수 있습니다. 'print setlocale ("KLINGON.UCS-4")'의 경우는 비어 있습니다. – mario

+0

실제로 지원되는 로케일을 찾으려고합니다. 내가하고있는 것은'setlocale (LC_ALL, 'hu_HU'); setlocale (LC_ALL, "en_US.utf8"); echo (strftime ('% Y. % B % d. % A')); '그러나 여전히 헝가리 인 상태입니다. "C"를 입력하면 변경됩니다. 해당 호스트에서 UTF-8 로켈이 지원되지 않을 수 있습니까? – zsero

관련 문제