2009-06-24 12 views

Respuesta

6
function is_utf8($string) { 
return preg_match('%^(?: 
[\x09\x0A\x0D\x20-\x7E] # ASCII 
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte 
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs 
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates 
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 
)*$%xs', $string); 

}

He comprobado. Esta función es efectiva.

0

si su envío al servidor u desde

echo $_SERVER['HTTP_ACCEPT_CHARSET']; 
+1

Puede tener UTF-8 ** y ** cadenas codificadas dentro de ISO 1 petición/archivo. ¿Cómo podrían ayudar los encabezados HTTP en cualquier caso? – DanFromGermany

33

No reinventar la rueda. Hay una función integrada para esa tarea: mb_check_encoding().

mb_check_encoding($string, 'UTF-8'); 
+1

¡Este es mi tipo de solución! –

+0

¿Qué sucede si no tienes esa extensión instalada? – CMCDragonkai

+2

@CMCDragonkai Si sus datos están en un formato multibyte (como UTF-8), definitivamente debe instalar la extensión PHP que proporciona las funciones para operar correctamente en su entrada. Si usa 'strlen' en una cadena UTF-8, por ejemplo, obtendrá la longitud incorrecta si la entrada contiene caracteres no ASCII. – soulmerge

6

Mejor aún, utilice las dos soluciones anteriores.

function isUtf8($string) { 
    if (function_exists("mb_check_encoding") && is_callable("mb_check_encoding")) { 
     return mb_check_encoding($string, 'UTF8'); 
    } 

    return preg_match('%^(?: 
      [\x09\x0A\x0D\x20-\x7E]   # ASCII 
     | [\xC2-\xDF][\x80-\xBF]    # non-overlong 2-byte 
     | \xE0[\xA0-\xBF][\x80-\xBF]  # excluding overlongs 
     | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 
     | \xED[\x80-\x9F][\x80-\xBF]  # excluding surrogates 
     | \xF0[\x90-\xBF][\x80-\xBF]{2}  # planes 1-3 
     | [\xF1-\xF3][\x80-\xBF]{3}   # planes 4-15 
     | \xF4[\x80-\x8F][\x80-\xBF]{2}  # plane 16 
    )*$%xs', $string); 

} 
+1

Llamar a ambos function_exists() e is_callable() es redundante, puede omitir uno de ellos. Pero como is_callable() está destinado a verificar si el parámetro es una devolución de llamada válida (ver el enlace a continuación), usaría function_exists() para hacerlo más legible. Enlace al pseudo-tipo de devolución de llamada: http://php.net/manual/en/language.pseudo-types.php#language.types.callback – soulmerge

+0

@ nikc.org - No entiendo - ¿Por qué quieres probar? si la función 'mb_check_encoding' existe? – JDelage

+2

@JDelage porque es parte de una extensión (php.net/manual/en/book.mbstring.php) que no se garantiza que esté siempre presente. –

15

Sólo una nota:

No se puede determinar si una determinada cadena está codificada en UTF-8. Solo puede determinar si una cadena dada es definitivamente no codificada en UTF-8. Por favor, vea una pregunta relacionada here:

No se puede detectar si una determinada cadena (o secuencia de bytes) es una codificación UTF-8 de texto como, por ejemplo, todos y cada serie de UTF-8 octetos es también una válido (si no tiene sentido) serie de octetos Latin-1 (o alguna otra codificación). Sin embargo, no todas las series de octetos Latin-1 válidos son series UTF-8 válidas.

0

Ninguna de las respuestas anteriores es correcta. Sí, pueden estar trabajando. Si toma la respuesta con la función preg_replace, ¿está tratando de matar su servidor si procesa mucha agitación? Utilice esta función pura de PHP sin expresiones regulares, trabaje el 100% del tiempo y es mucho más rápido.

if(function_exists('grk_Is_UTF8') === FALSE){ 
    function grk_Is_UTF8($String=''){ 
     # On va calculer la longeur de la chaîne 
     $Len = strlen($String); 

     # On va boucler sur chaque caractère 
     for($i = 0; $i < $Len; $i++){ 
      # On va aller chercher la valeur ASCII du caractère 
      $Ord = ord($String[$i]); 
      if($Ord > 128){ 
       if($Ord > 247){ 
        return FALSE; 
       } elseif($Ord > 239){ 
        $Bytes = 4; 
       } elseif($Ord > 223){ 
        $Bytes = 3; 
       } elseif($Ord > 191){ 
        $Bytes = 2; 
       } else { 
        return FALSE; 
       } 

       # 
       if(($i + $Bytes) > $Len){ 
        return FALSE; 
       } 

       # On va boucler sur chaque bytes/caractères 
       while($Bytes > 1){ 
        # +1 
        $i++; 

        # On va aller chercher la valeur ASCII du caractère/byte 
        $Ord = ord($String[$i]); 
        if($Ord < 128 OR $Ord > 191){ 
         return FALSE; 
        } 

        # Parfait 
        $Bytes--; 
       } 
      } 
     } 

     # Vrai 
     return TRUE; 
    } 
} 
1

mb_detect_encoding($string); devolverá el conjunto de caracteres actual de $string. mb_check_encoding($string, 'UTF-8');devolverá TRUE si conjunto de caracteres de $string es UTF-8 persona FALSO

Cuestiones relacionadas