Position actuelle: Accueil> Derniers articles> Comment utiliser la fonction chr () pour générer une chaîne avec des caractères spéciaux?

Comment utiliser la fonction chr () pour générer une chaîne avec des caractères spéciaux?

gitbox 2025-09-23

Dans PHP, Chr () est une fonction très basique mais couramment utilisée: il prend un entier (0–255) et renvoie le caractère à un octet correspondant. Par exemple, Chr (65) renvoie "A" . Cependant, lorsqu'il s'agit de "caractères spéciaux" - tels que des caractères de contrôle, des séquences d'octets binaires ou des caractères multi-octets (UTF-8) (comme les chinois, les émoticônes), il est nécessaire de comprendre les limites de Chr () et de coopérer avec d'autres méthodes pour générer la chaîne souhaitée.

Ce qui suit est quelques scénarios pour illustrer les pratiques et les précautions communes, et donne des exemples qui peuvent être copiés et exécutés directement.


1) Générer des caractères ASCII / Control (octet unique)

Ce que Chr () est le meilleur pour générer des caractères à un octet: il peut être utilisé pour générer des lignes de nouvelles, des onglets, des caractères de contrôle invisibles ou des valeurs d'octets de 0 à 255.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// capital A</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">65</span></span><span>); </span><span><span class="hljs-comment">// Sortir A</span></span><span>

</span><span><span class="hljs-comment">// Pause(LF)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"line1"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>) . </span><span><span class="hljs-string">"line2"</span></span><span>;

</span><span><span class="hljs-comment">// Symboles d&#39;onglet(TAB)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"col1"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">9</span></span><span>) . </span><span><span class="hljs-string">"col2"</span></span><span>;

</span><span><span class="hljs-comment">// Générer des fragments de données binaires</span></span><span>
</span><span><span class="hljs-variable">$bytes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x00</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xFF</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x7A</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$bytes</span></span><span>); </span><span><span class="hljs-comment">// string(3) "\x00\xFFz"</span></span><span>
</span></span>

Astuce : Lorsque vous traitez avec des protocoles binaires, des en-têtes de fichiers ou des packages réseau, Chr () est très pratique pour construire des octets.


2) Générer plusieurs octets à la fois: utilisez pack () ou épisser chr ()

Si vous souhaitez construire plusieurs octets consécutifs à la fois, Pack () est plus simple et a de meilleures performances qu'un grand nombre d'épissage chr () .

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// utiliser pack Générer trois octets:0x01 0x02 0x03</span></span><span>
</span><span><span class="hljs-variable">$bin</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pack</span></span><span>(</span><span><span class="hljs-string">'C*'</span></span><span>, </span><span><span class="hljs-number">0x01</span></span><span>, </span><span><span class="hljs-number">0x02</span></span><span>, </span><span><span class="hljs-number">0x03</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-variable">$bin</span></span><span>); </span><span><span class="hljs-comment">// Sortir "010203"</span></span><span>

</span><span><span class="hljs-comment">// Épissage chr Chemin(équivalence)</span></span><span>
</span><span><span class="hljs-variable">$bin2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">3</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-variable">$bin2</span></span><span>); </span><span><span class="hljs-comment">// "010203"</span></span><span>
</span></span>

3) Générez des caractères multi-octets UTF-8 (chinois, émoticônes, etc.)

chr () ne renvoie que des octets simples. UTF-8 Les caractères multipyte (point de code> 0xff) ne peuvent pas être générés directement par Chr () . Les alternatives courantes comprennent:

Méthode A - Utilisez mb_convert_encoding () / html_entity_decode () (basé sur l'entité html)

Pour les points de code Unicode connus (tels que les émoticônes U + 1F600), vous pouvez les convertir en UTF-8 via des entités HTML:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 使utiliser HTML Émoticônes de génération d&#39;entités(Par exemple ?? U+1F600)</span></span><span>
</span><span><span class="hljs-variable">$emoji</span></span><span> = </span><span><span class="hljs-title function_ invoke__">html_entity_decode</span></span><span>(</span><span><span class="hljs-string">'&amp;#x1F600;'</span></span><span>, ENT_NOQUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$emoji</span></span><span> . PHP_EOL;
</span></span>

Méthode B - Utilisez intlchar :: chr () (si l'extension intl est installée)

Si le serveur a EXT-INTL activé, vous pouvez dire directement sur le point de code Unicode pour générer des caractères:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// besoin ext-intl</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title class_">IntlChar</span></span><span>::</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x4E2D</span></span><span>); </span><span><span class="hljs-comment">// Sortir "milieu"</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title class_">IntlChar</span></span><span>::</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x1F600</span></span><span>); </span><span><span class="hljs-comment">// Sortir ??(expression)</span></span><span>
</span></span>

Méthode C - Utilisez des octets binaires (hex) - hex2bin () pour générer une séquence d'octet UTF-8 spécifique

Lorsqu'une séquence d'octets hexadécimaux UTF-8 de caractères connus, la chaîne d'octet peut être construite directement:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// "milieu" de UTF-8 L&#39;encodage est E4 B8 AD</span></span><span>
</span><span><span class="hljs-variable">$zh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hex2bin</span></span><span>(</span><span><span class="hljs-string">'e4b8ad'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$zh</span></span><span>; </span><span><span class="hljs-comment">// Sortir milieu</span></span><span>

</span><span><span class="hljs-comment">// expression ?? de UTF-8 L&#39;encodage est F0 9F 98 80</span></span><span>
</span><span><span class="hljs-variable">$emoji</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hex2bin</span></span><span>(</span><span><span class="hljs-string">'f09f9880'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$emoji</span></span><span>; </span><span><span class="hljs-comment">// Sortir ??</span></span><span>
</span></span>

Remarque : Ici hex2bin () écrit directement la valeur d'octets de l'UTF-8, qui convient aux cas où vous connaissez les séquences d'octets (comme à partir de spécifications ou de capture de paquets de réseau).


4) Méthode générale pour gérer le code Unicode pointe vers UTF-8

Si vous avez un point entier, vous avez besoin d'une fonction générale pour la convertir en caractères UTF-8 (sans vous fier à des extensions supplémentaires), vous pouvez implémenter une conversion simple vous-même (ce qui suit est l'exemple d'implémentation):

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">codepoint_to_utf8</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">int</span></span></span><span> </span><span><span class="hljs-variable">$cp</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> &lt;= </span><span><span class="hljs-number">0x7F</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-variable">$cp</span></span><span>);
    } </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> &lt;= </span><span><span class="hljs-number">0x7FF</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xC0</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> &gt;&gt; </span><span><span class="hljs-number">6</span></span><span>)) .
               </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> &amp; </span><span><span class="hljs-number">0x3F</span></span><span>));
    } </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> &lt;= </span><span><span class="hljs-number">0xFFFF</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xE0</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> &gt;&gt; </span><span><span class="hljs-number">12</span></span><span>)) .
               </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | ((</span><span><span class="hljs-variable">$cp</span></span><span> &gt;&gt; </span><span><span class="hljs-number">6</span></span><span>) &amp; </span><span><span class="hljs-number">0x3F</span></span><span>)) .
               </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> &amp; </span><span><span class="hljs-number">0x3F</span></span><span>));
    } </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> &lt;= </span><span><span class="hljs-number">0x10FFFF</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xF0</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> &gt;&gt; </span><span><span class="hljs-number">18</span></span><span>)) .
               </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | ((</span><span><span class="hljs-variable">$cp</span></span><span> &gt;&gt; </span><span><span class="hljs-number">12</span></span><span>) &amp; </span><span><span class="hljs-number">0x3F</span></span><span>)) .
               </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | ((</span><span><span class="hljs-variable">$cp</span></span><span> &gt;&gt; </span><span><span class="hljs-number">6</span></span><span>) &amp; </span><span><span class="hljs-number">0x3F</span></span><span>)) .
               </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> &amp; </span><span><span class="hljs-number">0x3F</span></span><span>));
    }
    </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">'Invalid Unicode code point'</span></span><span>);
}

</span><span><span class="hljs-comment">// 使utiliser</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">codepoint_to_utf8</span></span><span>(</span><span><span class="hljs-number">0x4E2D</span></span><span>);   </span><span><span class="hljs-comment">// milieu</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">codepoint_to_utf8</span></span><span>(</span><span><span class="hljs-number">0x1F600</span></span><span>); </span><span><span class="hljs-comment">// ??</span></span><span>
</span></span>

Cette fonction utilise toujours Chr () pour construire chaque octet UTF-8, qui est une solution générale pour le php pur.


5) Pièges et suggestions communes

  • Plage de paramètres de Chr () : uniquement applicable à un seul octet (0–255). Passer des valeurs supérieures à 255 provoquera une troncature (en prenant les 8 bits inférieurs), ce qui n'est généralement pas le comportement que vous souhaitez.

  • Encoding Environment : Lors du traitement des caractères multipyte, assurez-vous que la chaîne est codée en tant que UTF-8 et que les fonctions connexes (telles que JSON_ENCOD , strlen ) font attention à utiliser la série MB_ * ou spécifier le codage correct.

  • Affichage et transfert : certains environnements (terminaux, en-têtes HTTP, colonnes de base de données) sont sensibles au codage. Après avoir construit des caractères UTF-8, n'oubliez pas de déclarer le codage correct lors de la sortie ou du stockage (par exemple, ajoutez <meta charset = "utf-8"> à la page HTML ou définissez le type de contenu: text / html; charset = utf-8 ).

  • Outils préférés : si vous avez seulement besoin de gérer les points de code Unicode, utilisez des fonctions intlchar :: chr () (si disponible) ou MB_ * / de conversion car ce sont de la sémantique et ont moins d'erreurs.


6) Tableau de référence rapide (vérification)

 <span><span><span class="hljs-comment">// Personnage d&#39;octet unique</span></span><span>
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">65</span></span><span>); </span><span><span class="hljs-comment">// "A"</span></span><span>
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// LF Pause</span></span><span>

</span><span><span class="hljs-comment">// Multi-octets / Unicode Alternative</span></span><span>
</span><span><span class="hljs-title function_ invoke__">html_entity_decode</span></span><span>(</span><span><span class="hljs-string">'&amp;#x1F600;'</span></span><span>, ENT_NOQUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>); </span><span><span class="hljs-comment">// ??</span></span><span>
</span><span><span class="hljs-title class_">IntlChar</span></span><span>::</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x4E2D</span></span><span>); </span><span><span class="hljs-comment">// "milieu"(besoin ext-intl)</span></span><span>
</span><span><span class="hljs-title function_ invoke__">hex2bin</span></span><span>(</span><span><span class="hljs-string">'e4b8ad'</span></span><span>); </span><span><span class="hljs-comment">// "milieu"(直接utiliser UTF-8 Octets hexadécimaux)</span></span><span>

</span><span><span class="hljs-comment">// Convertir les points de code vers UTF-8(见上面de codepoint_to_utf8)</span></span><span>
</span></span>

Résumer

chr () est très simple et direct lors de la génération de caractères à un octet (0–255) et de données binaires; Mais lorsqu'il est confronté à des caractères Unicode multi-octe (chinois, emoji), il est nécessaire d'obtenir des résultats fiables avec intlchar :: chr () , une conversion d'entité HTML, des fonctions de conversion hex2bin () ou de code personnalisé Point-to-UTF-8. La sélection de la méthode appropriée en fonction de votre scénario spécifique (protocole réseau, traitement de fichiers, sortie de la page Web) et faisant attention à la cohérence de l'encodage, peut générer de manière stable diverses chaînes de "caractères spéciaux".