2011-10-28 2 views
5

가능한 경우 UTF-8 문자열에서 특수 문자와 액센트를 ASCII 문자로 바꾸어서 제거하려고합니다.PHP의 iconv가 왜 고정되어 있어야합니까?

그래서 나는 단순히이 코드를 사용하고 있습니다 :

$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

문제 것은 예를 들어 단어 "데뷔"대신에 "데뷔"의 "dbut"로 변한다는 것이다. 나는 다음과 같이 된 setlocale에 대한 호출을 추가 할 필요가, 그것이 작동되도록하려면

setlocale(LC_ALL, 'en_US.UTF8'); 
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

그리고 그 이유를 이해하지 않습니다. UTF-8과 ASCII는 사용하는 로케일이 항상 동일하다고 생각했습니다.

편집 : 내 말은하지 않았다 UTF-8은 내가 UTF-8은 항상 UTF-8과 동일하고 ASCII은 항상 ASCII에게

+0

ASCII 및 UTF-8은 동일하지 않습니다. UTF-8은 더 큰 규모입니다. – NikiC

답변

1

ASCII와 중복 UTF-8의 부분 집합 (코드는 동일 의미, ASCII와 동일 0-127 점)은 실제로 ASCII와 동일합니다. 그러나 악센트 부호가있는 라틴 문자는 ASCII 문자 집합의 일부가 아니며 setlocale을 사용하지 않으면 시스템의 기본 로캘 (분명히 악센트 부호가없는 문자)이 작동하도록 문자 집합을 가져 오는 데 사용됩니다.

일반적으로 iconv은 약간 일 수 있습니다. 이것은 확장의 introduction에서 언급 한 :

이 모듈은 문자 집합 변환 iconv 기능을하는 인터페이스가 포함되어 있습니다. 이 모듈을 사용하면 로컬 문자 세트로 표현 된 문자열을 유니 코드 문자 세트 인 다른 문자 세트 으로 나타내는 문자로 변환 할 수 있습니다. 지원되는 문자 집합 은 시스템의 iconv 구현에 따라 다릅니다. 일부 시스템에서는 iconv 기능이 예상대로 작동하지 않을 수 있습니다. 그런 경우 GNU libiconv 라이브러리를 설치하는 것이 좋습니다. 이 가장 일관성있는 결과를 얻게 될 가능성이 높습니다.

관련 문제