當前位置: 首頁> 最新文章列表> 怎樣利用chr() 函數生成帶有特殊字符的字符串?

怎樣利用chr() 函數生成帶有特殊字符的字符串?

gitbox 2025-09-23

在PHP 中, chr()是一個非常基礎但常用的函數:它接受一個整數(0–255)並返回對應的單字節字符。例如chr(65)返回"A" 。不過在處理“特殊字符”——比如控製字符、二進製字節序列、或多字節(UTF-8)字符(例如中文、表情)時,需要理解chr()的局限並配合其他方法來生成期望的字符串。

下面分幾個場景說明常見做法與註意事項,並給出可直接複製運行的示例。


1) 生成ASCII / 控製字符(單字節)

chr()最擅長的就是生成單字節字符:可用於生成換行、製表符、不可見控製字符或者任意0–255 的字節值。

 <span><span><span class="hljs-meta">&lt;?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()非常方便來構造任意字節。


2) 一次生成多個字節:使用pack()或拼接chr()

如果要一次性構造多個連續的字節, pack()比大量拼接chr()更簡潔且性能好一些。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 用 pack 生成三個字節: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>

3) 生成UTF-8 多字節字符(中文、表情等)

chr()只返回單字節。 UTF-8 多字節字符(代碼點> 0xFF)不能直接由chr()生成。常用替代方法包括:

方法A — 使用mb_convert_encoding() / html_entity_decode() (基於HTML 實體)

對已知Unicode 碼點(如U+1F600 表情)可通過HTML 實體轉換為UTF-8:

 <span><span><span class="hljs-meta">&lt;?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">'&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>

方法B — 使用IntlChar::chr() (如果安裝了intl 擴展)

如果服務器啟用了ext-intl ,可以直接按Unicode 代碼點生成字符:

 <span><span><span class="hljs-meta">&lt;?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>

方法C — 使用二進製字節(hex)—— hex2bin()生成特定UTF-8 字節序列

已知字符的UTF-8 十六進製字節序列時,可直接構造字節串:

 <span><span><span class="hljs-meta">&lt;?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 的字節值,適用於你已知字節序列的情況(例如來自規範或網絡抓包)。


4) 處理Unicode 碼點到UTF-8 的通用方法

如果你有一個整數碼點,需要通用函數把它轉成UTF-8 字符(不依賴額外擴展),可以自己實現簡單的轉換(下面為示例實現):

 <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">// 使用</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 的通用方案。


5) 常見陷阱與建議

  • chr()的參數範圍:只適用於單字節(0–255)。傳入大於255 的值會發生截斷(取低8 位),這通常不是你想要的行為。

  • 編碼環境:在處理多字節字符時確保字符串編碼為UTF-8 並且相關函數(例如json_encodestrlen )時注意使用mb_*系列或指定正確編碼。

  • 顯示與傳輸:某些環境(終端、HTTP 頭、數據庫列)對編碼敏感。構造好UTF-8 字符後,記得在輸出或存儲時聲明正確編碼(例如HTML 頁面加上<meta charset="utf-8">或設置Content-Type: text/html; charset=utf-8 )。

  • 首選工具:如果你只需要處理Unicode 代碼點,優先使用IntlChar::chr() (若可用)或mb_* / 轉換函數,因為它們語義明確並少出錯。


6) 快速參考表(小抄)

 <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">'&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">// "中"(需 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 十六進製字節)</span></span><span>

</span><span><span class="hljs-comment">// 自己把代碼點轉換為 UTF-8(見上面的 codepoint_to_utf8)</span></span><span>
</span></span>

總結

chr()在生成單字節(0–255)字符和二進制數據時非常簡單直接;但面對多字節的Unicode 字符(中文、emoji)時,需要配合IntlChar::chr() 、HTML 實體轉換、 hex2bin()或自定義的碼點到UTF-8 轉換函數來實現可靠的結果。根據你的具體場景(網絡協議、文件處理、網頁輸出)選擇合適的方法並註意編碼一致性,就能穩定生成各種“特殊字符”的字符串。