Question

J'ai rencontré une chaîne particulière (elle n'est pas complètement imprimable, mais vous pouvez le voir ci-dessous) qui provoque une chaîne HTMLSpecialCalchars ().Y a-t-il une façon que cela puisse être corrigé?

$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');

sortie:

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

Était-ce utile?

La solution

Je comprends maintenant pourquoi cela retourne une chaîne de longueur zéro. Désolé de poser cette question. J'aurais dû rechercher plus avant de poster. Quoi qu'il en soit, la réponse est la suivante:

sur le manuel PHP page pour HTMLSpecialchars :

Si la chaîne d'entrée contient une séquence d'unité de code non valide dans l'encodage donné d'une chaîne vide sera renvoyée, sauf si les indicateurs ENT_IGNORE ou ENT_SUBSTIVES sont définis.

Puis je me demande ce qui est "invalide" à propos de cette chaîne? Sur le wiki page pour UTF-8 Cela donne un bon diagramme de UTF- 8 codage. Tous les points de code représentant "texte brut ASCII" serait 0-127 (le MSB dans l'octet est toujours 0).

Si MSB d'un octet est de 1 (décimal 128 à 255), il indique à un analyseur conforme de l'UTF-8 que le code de code est constitué d'une chaîne multi-octets. et les deux premiers bits les plus importants de l'octet les deux premiers bit doivent être un 1 suivi d'un 0.

Évidemment dans cette chaîne, il existe un cas où un octet est supérieur à 127 et l'octet suivant ne commence pas avec un 1 et 0. Par conséquent, il est invalide de codage UTF-8.

Merci pour Ceci donc post Pour la résolution, qui, à mon avis, est d'utiliser le drapeau ENT_SUBSTITUT (ou je suppose que ent_ignore si vous êtes sûr que la suppression de ces octets non conformes ne sera pas Un problème de sécurité ).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top