PHPでは、 Chr()は非常に基本的ですが、一般的に使用される機能です。整数(0〜255)を取り、対応するシングルバイト文字を返します。たとえば、 Chr(65)は「A」を返します。ただし、コントロール文字、バイナリバイトシーケンス、またはマルチバイト(UTF-8)文字(中国語、絵文字など)などの「特殊文字」を扱う場合、 chr()の制限を理解し、他の方法と協力して目的の文字列を生成する必要があります。
以下は、一般的な慣行と予防策を説明するためのいくつかのシナリオであり、直接コピーして実行できる例を示します。
Chr()がシングルバイト文字を生成するのに最適なもの:新しいライン、タブ、目に見えないコントロール文字、または0〜255の任意のバイト値を生成するために使用できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 資本 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">// 出力 A</span></span><span>
</span><span><span class="hljs-comment">// ラインブレーク(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)</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">// バイナリデータフラグメントを生成します</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>ヒント:バイナリプロトコル、ファイルヘッダー、またはネットワークパッケージを扱う場合、 Chr()はバイトを構築するのに非常に便利です。
複数の連続バイトを一度に構築する場合は、 Pack()はよりシンプルで、多数のスプライシングChr()よりも優れたパフォーマンスを持っています。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 使用 pack 3バイトを生成します: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">// 出力 "010203"</span></span><span>
</span><span><span class="hljs-comment">// スプライシング chr 方法(等価)</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()は単一のバイトのみを返します。 UTF-8マルチバイト文字(コードポイント> 0xFF)は、 Chr()で直接生成できません。一般的な代替品には次のものがあります。
既知のUnicodeコードポイント(U+1F600絵文字など)については、HTMLエンティティからUTF-8に変換できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 使使用 HTML エンティティジェネレーションの絵文字(例えば ?? 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>サーバーがExt-INTLを有効にしている場合、Unicodeコードポイントを直接押して文字を生成できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 必要 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">// 出力 "真ん中"</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">// 出力 ??(表現)</span></span><span>
</span></span>既知の文字のUTF-8ヘキサデシマルバイトシーケンスの場合、バイト文字列を直接構築できます。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// "真ん中" の UTF-8 エンコーディングはです 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">// 出力 真ん中</span></span><span>
</span><span><span class="hljs-comment">// 表現 ?? の UTF-8 エンコーディングはです 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">// 出力 ??</span></span><span>
</span></span>注:ここでは、 hex2bin()がUTF-8のバイト値を直接書き出します。これは、バイトシーケンス(仕様やネットワークパケットキャプチャなど)を知っている場合に適しています。
整数ポイントがある場合は、UTF-8文字に変換するための一般的な関数が必要です(追加の拡張機能に依存せずに)、単純な変換を自分で実装できます(以下は実装の例です):
<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">// 使使用</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">// 真ん中</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>この関数は依然としてChr()を使用して各UTF-8バイトを構築します。これは純粋なPHPの一般的なソリューションです。
Chr()のパラメーター範囲:単一バイト(0〜255)にのみ適用されます。 255を超える値を渡すと、通常は必要な動作ではありません。
エンコーディング環境:マルチバイト文字を処理するときは、文字列がUTF-8としてエンコードされ、関連する関数( json_encode 、 strlenなど)がMB_*シリーズを使用するか、正しいエンコードを指定するように注意してください。
ディスプレイと転送:一部の環境(端子、HTTPヘッダー、データベース列)は、エンコードに敏感です。 UTF-8文字を作成した後、出力またはストレージのときに正しいエンコードを宣言することを忘れないでください(たとえば、 <Meta charset = "utf-8">をHTMLページに追加するか、コンテンツタイプ:text/html; charset = utf-8 )を設定します。
優先ツール:Unicodeコードポイントのみを処理する必要がある場合は、SMANTICSであり、エラーが少ないため、 IntlChar :: chr()またはmb_* /変換機能を使用します。
<span><span><span class="hljs-comment">// シングルバイト文字</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 ラインブレーク</span></span><span>
</span><span><span class="hljs-comment">// マルチバイト / Unicode 代替</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">// "真ん中"(必要 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">// "真ん中"(直接使用 UTF-8 16進バイト)</span></span><span>
</span><span><span class="hljs-comment">// コードポイントを変換します UTF-8(见上面の codepoint_to_utf8)</span></span><span>
</span></span>Chr()は、シングルバイト(0〜255)文字とバイナリデータを生成するときに非常にシンプルで直接的です。しかし、マルチバイトユニコード文字(中国語、絵文字)に直面する場合、 intlChar :: chr() 、HTMLエンティティ変換、 hex2bin() 、またはカスタムコードポイントツーUTF-8変換機能で信頼できる結果を達成する必要があります。特定のシナリオ(ネットワークプロトコル、ファイル処理、Webページの出力)に従って適切な方法を選択し、エンコードの一貫性に注意を払うと、さまざまな「特殊文字」文字列を安定に生成できます。