2012-07-02 4 views
1

정말 고맙겠습니다. 나는이 문제에 대한 시절을 낭비했고, 온라인에서 발견 한 제안 중 어느 것도 나에게 수정을주는 것처럼 보이지 않는다.PHP - 이상한 문자를 제거 할 수 없습니다.

나는 공급자로부터받은 CSV 파일을 가지고 있습니다. Microsoft 시스템에서 내 보낸 것으로 보입니다.

PHP를 사용하여 MySQL로 데이터를 가져오고 있습니다 (최신 버전 모두).

필자가 제거 할 수없는 이상한 문자가 포함 된 특정 레코드가 하나 있습니다. 문자를 제거하는 수동 편집은 가능하지만 하루에 여러 번 발생하므로 자동화 된 솔루션을 선호합니다.

"스마트 쿼트"의 해석 인 것처럼 보입니다. 16 진수 편집기는 문자 코드가 C2와 92라는 것을 알려줍니다. 16 진수 편집기에서는 이상한 A 다음에 똑똑한 따옴표가옵니다. 다른 편집기와 Calc, Writer 등에서는 그냥 상자로 나타납니다. 내

인코딩을 결정하기 위해 mb_detect_encoding을 사용하고 있습니다. CSV 파일의 모든 레코드는 UTF-8로 반환되는 이상한 문자가있는 문자를 제외하고는 ASCII로 반환됩니다. 문제가되는 레코드를 MySQL에 삽입 할 수 있으며 워크 벤치의 사각형으로 나타납니다.

MySQL 테이블은 utf-8 – utf8_unicode_ci으로 구성되며 다른 비정상적인 UTF 문자 (예 : 분수)는 정상입니다.

나는이에 대한 해결책을 많이 해봤 ...

등 C 등. 그러나 그들 중의 누구도 나를 위해 일하지 않았다.

내가 정말로하고 싶은 것은 불쾌한 캐릭터를 제거하거나 대체하는 것입니다. 이상적인 것은 검색하고 16 진수 값을 바꾸는 것입니다. 그러나 제가 시도한 예제 중 아무 것도 시도하지 않았습니다.

아무도 나를 도와 줄 수 없습니까?

편집 :
이 충분하지 않은 평판으로 대답을 게시 할 수 없습니다 귀하의 의견
감사합니다. 매우 감사.
난 그냥 육각 검색을 가서 대체하는거야 :

$DodgyText = preg_replace("/\xEF\xBE\x92/", "" ,$DodgyText); 

나는 우아한 해결책이 아니다 알고,하지만 난 빠른 수정이 필요하고이 나를 위해 작동합니다.

+1

'C292'는 AFAIK 유효한 UTF-8/유니 코드 코드 포인트가 아닙니다 ... WTF, Microsoft? – deceze

+0

preg_replace()가 필요없고 발견 한 실제 16 진수 값을 기반으로 답변을 업데이트했습니다. –

답변

1

빠른보기에서 이것은 UTF-8 파일처럼 보입니다. (UTF-8은 ASCII 테이블의 처음 128 자와 동일하므로 특수 문자를 제외하고 모든 문자가 ASCII로 검색됩니다.)

데이터베이스 연결이 UTF-8로 인코딩 된 경우 작동합니다 기본적으로되지는 않음).

데이터베이스 라이브러리에 따라 수행 방법은 연결 인코딩 설정에 도움이 필요한 경우 사용중인 어댑터를 알려주십시오.

+0

다음을 사용하고 있습니다 : mysql_select_db (DB_DATABASE, $ db); mysql_query ("SET NAMES 'utf8'COLLATE 'utf8_unicode_ci'"); $ result = mysql_query ($ query, $ db); –

+0

@imimon 대명사없이 SET NAMES 'utf8' "'을 시도해보고 쿼리가 성공하는지 여부를 확인하기 위해 오류 검사를 수행 할 수 있습니까? –

+0

결과는 동일합니다. 메는 남아있다. –

0

설립 된 연구 결과에 따라 업데이트 된 코드

16 진수 사용하여 문자열을 대체 당신은 검색 &을 수행 할 수 있습니다이 특수 코드 값을 반환

str_replace("\xEF\xBE\x92", '', $value); 

제거를

즉, 데이터베이스 테이블이 UTF-8 인 경우 해당 변환이 필요하지 않습니다. 연결 (또는 세션) 문자 집합 (예 : SET NAMES utf8;)을 볼 수 있습니다. 이를 구성하는 작업은 데이터베이스에 연결하는 데 사용하는 라이브러리에 따라 다릅니다.

값을 디버깅하려면 bin2hex(); 이것은 일반적으로 온라인으로 검색하는 데 도움이됩니다.

+0

나는 그것을 시도하고 MySQL은 그것을 좋아하지 않았다. (질의 실패 : 잘못된 문자열 값 : '\ xBCqqq (... 열)) .'Qqq'는 내 것이다 –

+0

@SimonRoberts 내가 할 수있는 한 가지를 추가했다. 귀하의 질문에 개선, 정확한 문자열 내용을 16 진수 표기법 –

+0

나는 그 16 진수 값이 잘못되었을 수 있습니다. 그냥 다시보고 텍스트 문자열을 (이상한 문자에 대한 점을 대체)입니다 "that ... s 정확히 "입니다. 대응하는 16 진수 문자열은"74 68 61 74 EF BE 92 73 20 65 78 61 63 74 6C 79 " –

1

또 다른 해결책은 다음과 같습니다

$contents = iconv('UTF-8', 'Windows-1251//IGNORE',$contents); 
$contents = iconv('Windows-1251', 'UTF-8//IGNORE',$contents); 

로컬 인코딩으로 윈도우 1251을 대체 할 수있는 곳.

관련 문제