2017-11-10 16 views
0

나는 UTF-8에서 Windows-1252으로 CSV 데이터를 변환하는 데 iconv()을 사용합니다. iconv() - 문제를 일으키는 문자를 찾는 방법?

$converted = iconv("UTF-8", "Windows-1252", $csvData); 

은 어떤 경우에는, iconv()false을 돌려 조용히 실패했습니다.

또한 //TRANSLIT을 사용해 보았지만`iconv() '는 false를 다시으로 반환합니다.

//IGNORE 문을 대상 charset에 추가하면 변환이 성공하지만 하나 이상의 문자가 손실되었음을 의미합니다.

나는 //IGNORE에 붙어 있지만 어떤 문자가 문제를 일으키는 지 알고 싶습니다.

어떻게하면됩니까?

+0

나는 char 배열로 문자열을 사용하고 char에 iconv를 사용할 수 있다고 생각한다. –

+0

@VladLatish 고맙습니다 - 분명했습니다. 그러나 나는 그것에 대해 생각하지 않았습니다. 답으로 게시하십시오. 이 방법을 사용하여 나는 불쾌한 인물을 식별 할 수있었습니다. – SquareCat

+0

그들의 * "나는 생각한다"*는 많은 답변을 얻지 못합니다. @ VladLatish가 충분한 컨텍스트와 코드로 답변을 게시 할 수 없다면, 그 사람에게는별로 도움이되지 않을 것입니다. –

답변

0

(주석 질문 참조) 때문에 php string type

는 내부적으로 PHP 문자열은 바이트 배열 인 문자 배열로 문자열 작업을 나쁜 생각이었다. 결과적으로 배열 대괄호를 사용하여 문자열에 액세스하거나 수정하는 것은 다중 바이트 안전이 아니므로 ISO-8859-1과 같은 단일 바이트 인코딩의 문자열로만 수행해야합니다.

그래서 우리는 UTF-8 mb_substr를 사용 및 기호하지 바이트

error_reporting('E_ALL & !E_NOTICE'); 
$yourString = "test bad ☺ string"; 
$convertString = ''; 
$badChars = []; 

if (iconv("UTF-8", "Windows-1252", $yourString) === false) {  
    for($i = 0, $stringLength = mb_strlen($yourString); $i < $stringLength; $i++) { 
     $char = mb_substr($yourString, $i, 1); 
     $convertChar = iconv("UTF-8", "Windows-1252", $char); 

     if ($convertChar === false) { 
      $badChars[$i] = $char; 
     } else { 
      $convertString .= $convertChar; 
     } 
    } 
} else { 
    $convertString = iconv("UTF-8", "Windows-1252", $yourString); 
} 

var_dump($badChars, $convertString); 

결과 array(1) { [9]=> string(3) "☺" } string(16) "test bad string"

P.S. 작업 할 수 있습니다 다음 번에는 코드에 대한보다 자세한 답변을 드릴 것입니다. 내 실수