2010-12-10 2 views
17

타사 사이트에서 가져온 피드가 있고 때로는 utf8_decode 및 기타 utf8_encode을 적용하여 원하는 가시적 인 출력을 얻어야합니다.문자열에 utf8 디코드 또는 인코딩을 적용해야하는지 여부를 감지하는 방법은 무엇입니까?

실수로 동일한 내용이 두 번 적용되거나 잘못된 방법이 사용 된 경우 좀 더 추한 것을 얻습니다. 이것이 내가 바꾸고 싶은 것입니다.

문자열에 적용해야 할 부분을 어떻게 감지합니까?

UPDATE

사실 내용은 UTF-8을 반환하지만 내부 수없는 부분이있다.

+0

우리는 공급 특정 문자 집합을 선언하지만, 또 다른 하나를 사용하는 가정해야 하는가? –

+0

예, 그게 원인입니다. – Pentium10

+0

예제 피드를 제공하십시오 please – Gordon

답변

50

나는 mb_detect_encoding()에 의지 할 수 없다고 말할 수 없습니다. 잠시 후 이상한 가양 성이있었습니다.

나는 모든 경우에서 잘 작동하는 것으로 가장 보편적 인 방법이었다 :

if (preg_match('!!u', $string)) 
{ 
    // this is utf-8 
} 
else 
{ 
    // definitely not utf-8 
} 
+2

+1 문자열을 utf8로 변환하는 솔루션을 사용하는 utf8_validate()가 구현되어 있지 않으면 매력적입니다. –

+4

감사합니다! 그것은 매우 영리한 트릭입니다 .-) 내가 어떻게 작동하는지 전혀 알 수 없었기 때문에 PHP 문서에서 [this] (http://us2.php.net/manual/en/reference.pcre. (PCRE8) 이 수정자는 Perl과 호환되지 않는 PCRE의 추가 기능을 사용합니다. 패턴 문자열은 UTF-8로 처리됩니다. 이 수정자는 Unix에서는 PHP 4.1.0 이상에서, win32에서는 PHP 4.2.3에서 사용할 수 있습니다. 패턴의 UTF-8 유효성은 PHP 4.3.5부터 확인됩니다. ' 어쨌든, 고마워! – Edward

+2

regexp의 점이 필요하지 않습니다.'preg_match ('!! u', $ str)'ok ok – rsk82

0

피드 (일종의 XML 기반 피드를 의미하는 것 같습니다)는 헤더에 인코딩이 무엇인지 알려주는 속성을 가져야합니다. 그렇지 않다면 인코딩을 식별 할 수있는 확실한 수단이 없으므로 운이 없게됩니다.

3

당신은

감지 캐릭터 세트는 또한 HTTP Response Headers 또는 응답 데이터 자체에서 사용할 수 있습니다.

예 :

var_dump(
    mb_detect_encoding(
     file_get_contents('http://stackoverflow.com/questions/4407854') 
    ), 
    $http_response_header 
); 

출력 (codepad) :

string(5) "UTF-8" 
array(9) { 
    [0]=> 
    string(15) "HTTP/1.1 200 OK" 
    [1]=> 
    string(33) "Cache-Control: public, max-age=11" 
    [2]=> 
    string(38) "Content-Type: text/html; charset=utf-8" 
    [3]=> 
    string(38) "Expires: Fri, 10 Dec 2010 10:40:07 GMT" 
    [4]=> 
    string(44) "Last-Modified: Fri, 10 Dec 2010 10:39:07 GMT" 
    [5]=> 
    string(7) "Vary: *" 
    [6]=> 
    string(35) "Date: Fri, 10 Dec 2010 10:39:55 GMT" 
    [7]=> 
    string(17) "Connection: close" 
    [8]=> 
    string(21) "Content-Length: 34119" 
} 
0

인코딩 autotection이 방탄 아니지만 당신이 mb_detect_encoding()을 시도 할 수 있습니다. mb_check_encoding()도 참조하십시오.

3
function str_to_utf8 ($str) { 
    $decoded = utf8_decode($str); 
    if (mb_detect_encoding($decoded , 'UTF-8', true) === false) 
     return $str; 
    return $decoded; 
} 

var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière")); 
//string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56) 
var_dump(str_to_utf8("« Chrétiens d'Orient » : la RATP fait marche arrière")); 
//string '« Chrétiens d'Orient » : la RATP fait marche arrière' (length=56) 
관련 문제