Pregunta

Me encontré con una cadena en particular (no está completamente imprimible, pero puede verlo a continuación) que causa que un HTMLSpecialChars () devuelva una cadena de longitud cero.¿Hay alguna forma en que esto se puede arreglar?

$Stmnt = 'SELECT subject_name FROM bans WHERE id = 2321';
$Fetch = $Conn->query($Stmnt);
if(!$Fetch)
    die('Could not query DB');
while($Row = $Fetch->fetch_array(MYSQLI_ASSOC))
{
    $RawName = $Row['subject_name'];
    $RawLen = strlen($RawName);
    echo('RAW NAME: ['.$RawName.']'.', LENGTH: ['.$RawLen.']'.'<br />');
    for($i = 0; $i < $RawLen; $i++)
        echo('CHAR '.$i.' = ['.$RawName[$i].'] (ORD: '.ord($RawName[$i]).')<br />');

    $CleanName = htmlspecialchars($RawName, ENT_QUOTES, 'UTF-8');
    $CleanLen = strlen($CleanName);
    echo('CLEAN NAME: ['.$CleanName.']'.', LENGTH: ['.$CleanLen.']'.'<br />');
    for($i = 0; $i < $CleanLen; $i++)
        echo('CHAR '.$i.' = ['.$CleanName[$i].'] (ORD: '.ord($CleanName[$i]).')<br />');
}
$Fetch->close();
echo('DONE');

Salida:

RAW NAME: [━═★ Coммander Fι5н �], LENGTH: [31]
CHAR 0 = [�] (ORD: 226)
CHAR 1 = [�] (ORD: 148)
CHAR 2 = [�] (ORD: 129)
CHAR 3 = [�] (ORD: 226)
CHAR 4 = [�] (ORD: 149)
CHAR 5 = [�] (ORD: 144)
CHAR 6 = [�] (ORD: 226)
CHAR 7 = [�] (ORD: 152)
CHAR 8 = [�] (ORD: 133)
CHAR 9 = [ ] (ORD: 32)
CHAR 10 = [C] (ORD: 67)
CHAR 11 = [o] (ORD: 111)
CHAR 12 = [�] (ORD: 208)
CHAR 13 = [�] (ORD: 188)
CHAR 14 = [�] (ORD: 208)
CHAR 15 = [�] (ORD: 188)
CHAR 16 = [a] (ORD: 97)
CHAR 17 = [n] (ORD: 110)
CHAR 18 = [d] (ORD: 100)
CHAR 19 = [e] (ORD: 101)
CHAR 20 = [r] (ORD: 114)
CHAR 21 = [ ] (ORD: 32)
CHAR 22 = [F] (ORD: 70)
CHAR 23 = [�] (ORD: 206)
CHAR 24 = [�] (ORD: 185)
CHAR 25 = [5] (ORD: 53)
CHAR 26 = [�] (ORD: 208)
CHAR 27 = [�] (ORD: 189)
CHAR 28 = [ ] (ORD: 32)
CHAR 29 = [�] (ORD: 226)
CHAR 30 = [�] (ORD: 148)
CLEAN NAME: [], LENGTH: [0]
DONE

¿Fue útil?

Solución

Ahora entiendo por qué está devolviendo una cadena de longitud cero. Lo siento por hacer esta pregunta. Debería haber investigado más antes de publicar. De todos modos, la respuesta es la siguiente:

en el manual de PHP Página para HTMLSpecialChars :

Si la cadena de entrada contiene una secuencia de unidades de código no válida dentro de la codificación dada, se devolverá una cadena vacía, a menos que se establezcan las banderas ent_ignore o ent_substitute.

Entonces me pregunto qué es "inválido" sobre esta cadena? En el wiki Página para UTF-8 Da un buen diagrama de UTF- 8 codificación. Todos los codigos que representan el "texto simple ASCII" serían 0-127 (el MSB en el byte es siempre 0).

Si el MSB de un byte es 1 (decimal 128 a 255), le dice a un analizador compatible con UTF-8 que la Point de CodePoint consiste en una cadena de múltiples bytes. y los dos primeros bits más importantes de Los dos primeros bichos de bytes deben ser un 1 seguido de un 0.

Obviamente en esta cadena, hay un caso en el que un byte es superior a 127 y el siguiente byte no comienza con un 1 y 0. Por lo tanto, es la codificación UTF-8 no válida.

Gracias por Esto así, así que después de Para la resolución, que en mi opinión, es usar la bandera ENT_SUSTTITUTTE (o supongo ent_ignore si está seguro de que la eliminación de estos bytes no conformes no será un problema de seguridad ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top