¿Cómo puedo detectar caracteres no ASCII en una cadena?

Si tengo una cadena PHP, ¿cómo puedo determinar si contiene al menos un carácter no ASCII o no, de una manera eficiente? Y por caracteres no-ASCII, me refiero a cualquier carácter que no sea parte de esta tabla, http://www.asciitable.com/, en los puestos 32 – 126 inclusive.

Así que no sólo tienen que ser parte de la tabla ASCII, pero también se puede imprimir. Quiero detectar una cadena que contiene al menos un carácter que no cumpla con estas especificaciones (no-ASCII imprimibles, o un carácter diferente por completo, como un carácter Unicode que no es parte de esa tabla.

  • Por lo que no significa Unicode, pero no US-ASCII? Creo que esto vale para especificar si estás buscando algo eficiente.
  • ... by Unicode character, I mean any character that is not part ... Mal uso de la palabra «Unicode».
  • te refieres a los personajes 0-127 sólo?
  • Se puede hacer cualquier suposición segura acerca de la cadena, tales como la codificación?
  • Todos los caracteres ASCII son <= 127, y UTF-8 secuencia de caracteres que decodifica a un carácter no ASCII tiene al menos un byte con el mayor conjunto de bits. Por lo tanto, si usted no tiene ninguna byte >127, es ASCII. La detección de la codificación UTF-8, como se sugiere en las siguientes respuestas es probable que el trabajo también, pero, posiblemente, podría ser ambigua (ya que los caracteres ASCII se incidentially también los caracteres UTF-8).
  • Añadido aclaraciones. Lo siento por el anterior ambigüedad.
  • Similar a la stackoverflow.com/questions/4147646/…

InformationsquelleAutor rid | 2011-06-27

8 Kommentare

  1. 62

    He encontrado más útil para detectar si algún personaje se cae de la lista

    if(preg_match('/[^\x20-\x7e]/', $string))
    • +1, y para javascript /^[^\x20-\x7f]+$/.test(theString)
    • Tenga en cuenta que 0x7F es el carácter eliminar, por lo que debe ser ‘/[^\x20-\x7e]/’ desde 0x7e es ~, por lo que esta técnica no coincide con exactitud.
    • Esta respuesta es buena, pero se puede encontrar más soluciones en este post stackoverflow.com/questions/4147646/…
    • Yo creo que tu fragmentos de pruebas, si todos los caracteres de la cadena son ascii, para cualquier personaje código debe ser /[^\x20-\x7f]/.test(theString)
    • Me he permitido editar tu respuesta: como @simontemplar señaló acertadamente hace 6 años en un comentario, el 7F (DEL) no es un imprimibles ASCII char. También, el OP explícitamente pidió «32-126 inclusiva», que se traduce en 20-7E. Esta pregunta ha sido visto miles de veces, y su respuesta es la aceptada, por lo que no debe engañar a la gente!
  2. 34

    Puede utilizar mb_detect_encoding y comprobar ASCII:

    mb_detect_encoding($str, 'ASCII', true)

    Esto devolverá falso si $str contiene al menos un no-ASCI carácter (byte valor > 0x7F).

  3. 2

    Trate de: (Fuente)

    function is_ascii( $string = '' ) {
        return ( bool ) ! preg_match( '/[\\x80-\\xff]+/' , $string );
    }

    Aunque, todas las respuestas anteriores son correctas, pero, dependiendo de la entrada, estas soluciones pueden dar respuestas equivocadas. Consulte la última sección de esta ASCII de validación post.

  4. 2

    La función ctype_print devuelve true si todos los caracteres caen en el rango ASCII 32-126 (PHP de prueba de unidad).

    • php -r 'echo ctype_print("\xa0");' imprime 1 así que hay algo raro con esta función.
    • No puedo confirmar. Para mí, php -r 'var_dump(ctype_print("\xa0"));' devuelve false (usando PHP 7.0.10).
    • Estoy en PHP 7.0.10 demasiado, versión de Homebrew (OS X). Puede que la diferencia sea causada por la terminal, la configuración regional, php.ini u otros factores ambientales?
    • No me funciona bien, PHP 7.0.5 en Windows ni idea de por qué. No parece funcionar. Probablemente deberíamos abrir un informe de errores?
  5. 0

    Si usted no desea tratar con Regex en javascript que usted puede hacer

    detectUf8 : function(s) {
      var utf8=s.split('').filter(function(C) {
        return C.charCodeAt(0)>127;
      })
      return (utf8.join('').length>0);
    },

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea