2010-12-10 13 views
17

Tengo un feed tomado de sitios de terceros, y algunas veces tengo que aplicar utf8_decode y otras veces utf8_encode para obtener la salida visible deseada.¿Cómo detectar si tiene que aplicar decodificación u codificación de utf8 en una cadena?

Si por error se aplica lo mismo dos veces/o se usa el método incorrecto, obtengo algo más feo, esto es lo que quiero cambiar.

¿Cómo puedo detectar cuándo se debe aplicar en la cadena?

ACTUALIZACIÓN

En realidad el contenido devuelve UTF-8, pero en su interior hay partes que no lo son.

+0

¿Hay que suponer que la alimentación declara determinado conjunto de caracteres pero usa otro? –

+0

Sí, esa es la causa. – Pentium10

+0

indique un feed de ejemplo – Gordon

Respuesta

50

No puedo decir que puedo confiar en mb_detect_encoding(). Tuve algunos falsos positivos raros hace un tiempo.

La forma más universal que he encontrado para trabajar bien en todos los casos fue:

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

+1 Implementé utf8_validate() que usa su solución para convertir una cadena a utf8 si no lo es, ¡funciona como un encanto! –

+4

¡Gracias! Es un truco muy inteligente ;-) Como no tenía ni la más mínima idea de cómo funcionaba, profundicé en la documentación de PHP para encontrar [esto] (http://us2.php.net/manual/en/reference.pcre. pattern.modifiers.php): 'u (PCRE8) Este modificador activa la funcionalidad adicional de PCRE que es incompatible con Perl. Las cadenas de patrones se tratan como UTF-8. Este modificador está disponible desde PHP 4.1.0 o superior en Unix y desde PHP 4.2.3 en win32. La validez UTF-8 del patrón se verifica desde PHP 4.3.5. ' De todos modos, ¡muchas gracias! – Edward

+2

que ni siquiera se necesita dot in regexp 'preg_match ('!! u', $ str)' funciona bien – rsk82

0

El feed (supongo que te refieres a algún tipo de feed basado en xml) debe tener un atributo en el encabezado indicándote qué es la codificación. Si no, no tienes suerte ya que no tienes un medio confiable para identificar la codificación.

3

Puede utilizar

El juego de caracteres también puede estar disponible en el HTTP Response Headers o en los datos de respuesta en sí.

Ejemplo:

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

salida (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

Codificación autotection no es a prueba de balas, pero se puede tratar mb_detect_encoding(). Vea también 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) 
Cuestiones relacionadas