3

En PHP, l'utilisation des fonctions intégrées ne semble pas inclure de symboles spéciaux et nouveaux. TOUT y compris ceux sortis il y a 3 mois. Vous cherchez à transformer une chaîne de symboles mixtes tels que:Convertir TOUS les symboles en entités html

δϱж ☎

dans

𝕃𝕆𝕃 𝔯𝔬𝔠𝔰 𝓂𝓎 δϱж ☎

(que le navigateur rend le même)

Je vois cela se fait sur la mouche. Nous parlons d'innombrables symboles ici. Et qui sait combien de plus dans le futur.

Comment y parviennent-ils? Pas moyen, ils ont vraiment un tableau de clés de 1000 + de chaque symbole et son entité? J'ai rencontré toutes les questions connexes, pas de chance jusqu'à maintenant.

Répondre

2

Cette fonction vous permet de convertir tous les caractères (actuels et futurs) hors [0-9A-Za-z ] à une entité numérique. Le UTF-8 le codage des caractères est supposé:

function html_entity_encode_all($s) { 
    $out = ''; 
    for ($i = 0; isset($s[$i]); $i++) { 
     // read UTF-8 bytes and decode to a Unicode codepoint value: 
     $x = ord($s[$i]); 
     if ($x < 0x80) { 
      // single byte codepoints 
      $codepoint = $x; 
     } else { 
      // multibyte codepoints 
      if ($x >= 0xC2 && $x <= 0xDF) { 
       $codepoint = $x & 0x1F; 
       $length = 2; 
      } else if ($x >= 0xE0 && $x <= 0xEF) { 
       $codepoint = $x & 0x0F; 
       $length = 3; 
      } else if ($x >= 0xF0 && $x <= 0xF4) { 
       $codepoint = $x & 0x07; 
       $length = 4; 
      } else { 
       // invalid byte 
       $codepoint = 0xFFFD; 
       $length = 1; 
      } 
      // read continuation bytes of multibyte sequences: 
      for ($j = 1; $j < $length; $j++, $i++) { 
       if (!isset($s[$i + 1])) { 
        // invalid: string truncated in middle of multibyte sequence 
        $codepoint = 0xFFFD; 
        break; 
       } 
       $x = ord($s[$i + 1]); 
       if (($x & 0xC0) != 0x80) { 
        // invalid: not a continuation byte 
        $codepoint = 0xFFFD; 
        break; 
       } 
       $codepoint = ($codepoint << 6) | ($x & 0x3F); 
      } 
      if (($codepoint > 0x10FFFF) || 
       ($length == 2 && $codepoint < 0x80) || 
       ($length == 3 && $codepoint < 0x800) || 
       ($length == 4 && $codepoint < 0x10000)) { 
       // invalid: overlong encoding or out of range 
       $codepoint = 0xFFFD; 
      } 
     } 

     // have codepoint, now output: 
     if (($codepoint >= 48 && $codepoint <= 57) || 
      ($codepoint >= 65 && $codepoint <= 90) || 
      ($codepoint >= 97 && $codepoint <= 122) || 
      ($codepoint == 32)) { 
      // leave plain 0-9, A-Z, a-z, and space unencoded 
      $out .= $s[$i]; 
     } else { 
      // all others as numeric entities 
      $out .= '&#' . $codepoint . ';'; 
     } 
    } 
    return $out; 
} 

Pour le décodage, la fonction standard html_entity_decode peut être utilisé.

+0

Lorsque vous exécutez la chaîne via cette fonction, les sorties sont comme dans la question? Je l'ai couru localement et j'ai surtout obtenu des points d'interrogation sur les diamants, mais sur le serveur, je vois régulièrement des points d'interrogation. L'encodage de fichier est UTF-8. Je cours PHP 5.4.x –

+1

@JohnSmith Oui, la sortie est identique à celle de votre question: [https://eval.in/436085](https://eval.in/436085) – Boann

-2

Simple: l'encodage n'utilise aucune connaissance particulière. L'entrée est une valeur de caractère numérique, la sortie est &#<decimal-value>;.

+0

Regardez la réponse de Hanky ​​Panky. Il y a une table pour les cas spéciaux, avec 1500 entrées. Unicode 8.0 _alone_ [7700 caractères ajoutés] (http://blog.unicode.org/2015/06/announcing-unicode-standard-version-80.html). Au total, il y a 120.737 caractères Unicode, 80 fois plus que ce tableau. – MSalters

2

Comment y parviennent-ils? Pas moyen, ils ont vraiment un tableau de clés de 1000 + de chaque symbole et son entité?

Ils font en fait ont une translation table et il ne contient tous les symboles que vous avez dans votre question (et la table a plus de 1500 entrées :)).

Fiddle

+1

Et aucun de ceux-ci sont les nouveaux caractères ajoutés. En fait, je pense que tous les caractères de cette liste proviennent d'Unicode 2.1 (1998), et certainement pas ceux ajoutés il y a 3 mois à Unicode 8.0 – MSalters