In PHP ist CHR () eine sehr grundlegende, aber häufig verwendete Funktion: Es dauert eine Ganzzahl (0–255) und gibt das entsprechende Einzel-Byte-Zeichen zurück. Zum Beispiel gibt CHR (65) "a" zurück. Im Umgang mit "Sonderzeichen"-wie Kontrollzeichen, binären Byte-Sequenzen oder Multi-Byte-Zeichen (UTF-8) (wie Chinesen, Emoticons) ist es jedoch notwendig, die Grenzen von CHR () zu verstehen und mit anderen Methoden zusammenzuarbeiten, um die gewünschte Zeichenfolge zu erzeugen.
Das Folgende sind einige Szenarien, um allgemeine Praktiken und Vorsichtsmaßnahmen zu veranschaulichen, und es gibt Beispiele, die kopiert und direkt ausgeführt werden können.
Was CHR () am besten zum Generieren von Single-Byte-Zeichen erzeugt: Es kann verwendet werden, um Neulinien, Registerkarten, unsichtbare Steuerzeichen oder Byte-Werte von 0–255 zu generieren.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Hauptstadt 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">// Ausgabe A</span></span><span>
</span><span><span class="hljs-comment">// Zeilenpause(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">// Tab -Symbole(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">// Generieren Sie Binärdatenfragmente</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>TIPP : Wenn Sie mit binären Protokollen, Dateikopfzeilen oder Netzwerkpaketen umgehen, ist CHR () sehr bequem, um Bytes zu konstruieren.
Wenn Sie mehrere aufeinanderfolgende Bytes gleichzeitig konstruieren möchten, ist Pack () einfacher und hat eine bessere Leistung als eine große Anzahl von Spleißen -CHR () .
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// verwenden pack Erzeugen drei Bytes: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">// Ausgabe "010203"</span></span><span>
</span><span><span class="hljs-comment">// Spleißen chr Weg(Gleichwertigkeit)</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>CHR () gibt nur einzelne Bytes zurück. UTF-8-Multibyte-Zeichen (Codepunkt> 0xff) können nicht direkt von chr () generiert werden. Gemeinsame Alternativen umfassen:
Für bekannte Unicode-Codepunkte (wie U+1F600-Emoticons) können Sie sie über HTML-Entitäten in UTF-8 konvertieren:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 使verwenden HTML Entitätserzeugung Emoticons(Zum Beispiel ?? 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">'&#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>Wenn der Server ext-intl aktiviert ist, können Sie direkt den Unicode-Codepunkt drücken, um Zeichen zu generieren:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// brauchen 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">// Ausgabe "Mitte"</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">// Ausgabe ??(Ausdruck)</span></span><span>
</span></span>Wenn eine UTF-8-hexadezimale Byte-Sequenz bekannter Zeichen, kann die Byte-Zeichenfolge direkt konstruiert werden:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// "Mitte" von UTF-8 Die Codierung ist 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">// Ausgabe Mitte</span></span><span>
</span><span><span class="hljs-comment">// Ausdruck ?? von UTF-8 Die Codierung ist 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">// Ausgabe ??</span></span><span>
</span></span>Hinweis : Hier schreibt Hex2Bin () den Byte-Wert von UTF-8 direkt aus, der für Fälle geeignet ist, in denen Sie Byte-Sequenzen kennen (z. B. aus Spezifikationen oder Netzwerkpaketaufnahmen).
Wenn Sie einen Ganzzahlpunkt haben, benötigen Sie eine allgemeine Funktion, um sie in UTF-8-Zeichen umzuwandeln (ohne sich auf zusätzliche Erweiterungen zu verlassen), können Sie selbst eine einfache Conversion implementieren (Folgendes ist die Beispielimplementierung):
<span><span><span class="hljs-meta"><?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> <= </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> <= </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> >> </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> & </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> <= </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> >> </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> >> </span><span><span class="hljs-number">6</span></span><span>) & </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> & </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> <= </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> >> </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> >> </span><span><span class="hljs-number">12</span></span><span>) & </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> >> </span><span><span class="hljs-number">6</span></span><span>) & </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> & </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">// 使verwenden</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">// Mitte</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>Diese Funktion verwendet CHR () immer noch, um jedes UTF-8-Byte zu konstruieren, was eine allgemeine Lösung für reines PHP ist.
Parameterbereich von CHR () : Nur für ein Byte (0–255) anwendbar. Durch die Übergabe von Werten von mehr als 255 wird eine Kürzung verursacht (die unteren 8 Bits einnehmen), was normalerweise nicht das gewünschte Verhalten ist.
Codierungsumgebung : Wenn Sie Multibyte-Zeichen verarbeiten, stellen Sie sicher, dass die Zeichenfolge als UTF-8 codiert ist und dass verwandte Funktionen (z. B. JSON_Encode , Strlen ) die MB_* -Serie verwenden oder die richtige Codierung angeben.
Anzeige und Übertragung : Einige Umgebungen (Terminals, HTTP -Header, Datenbankspalten) sind für Codierung empfindlich. Denken Sie nach dem Erstellen von UTF-8-Zeichen daran, die richtige Codierung bei Ausgabe oder Speicher zu deklarieren (z. B. fügen Sie <meta charset = "utf-8"> zur HTML-Seite oder der Inhaltstyp hinzu: text/html; charset = utf-8 ).
Bevorzugte Tools : Wenn Sie sich nur mit Unicode -Codepunkten befassen müssen, verwenden Sie Intlchar :: chr () (falls verfügbar) oder MB_* / Conversion -Funktionen, da sie Semantik sind und weniger Fehler haben.
<span><span><span class="hljs-comment">// Einzelner Byte -Charakter</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 Zeilenpause</span></span><span>
</span><span><span class="hljs-comment">// Multi-byte / 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">'&#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">// "Mitte"(brauchen 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">// "Mitte"(直接verwenden UTF-8 Hexadezimal -Bytes)</span></span><span>
</span><span><span class="hljs-comment">// Codepunkte auf konvertieren auf UTF-8(见上面von codepoint_to_utf8)</span></span><span>
</span></span>CHR () ist sehr einfach und direkt, wenn sie Single-Byte-Zeichen (0–255) und binäre Daten generieren; Bei Multi-Byte-Unicode-Zeichen (Chinesisch, Emoji) müssen jedoch zuverlässige Ergebnisse mit Intlchar :: CHR () , HTML Entity Conversion, Hex2Bin () oder benutzerdefinierten Codepunkt-zu-UTF-8-Konvertierungsfunktionen erzielt werden. Die Auswahl der entsprechenden Methode gemäß Ihrem spezifischen Szenario (Netzwerkprotokoll, Dateiverarbeitung, Webseitenausgabe) und der Beachtung der Codierungskonsistenz können verschiedene "Sonderzeichen" stabil generieren.