تابع chr() در PHP
تابع chr() در PHP یک ابزار ساده اما پراستفاده برای تولید کاراکترهای بایتمحور از مقدار عددی است. این تابع یک رشتهٔ یکبایتی برمیگرداند که بایت آن برابر با مقدار عددی (mod 256) ورودی است. chr() برای کار با دادههای باینری، تولید کاراکترهای کنترلی و پاسخگویی به پروتکلهای سطح پایین بسیار مفید است، اما باید با تفاوت یونیکد و بایت آشنا باشید.
شرح عملکرد
امضای تابع به صورت کلی:
string chr ( int $ascii )نکات کلیدی:
- ورودی به صورت عدد صحیح گرفته میشود.
- مقدار نهایی واقعی بایت برابر است با مقدار ورودی & 0xFF (یعنی mod 256).
- خروجی همیشه یک رشتهٔ طولِ یک بایت است؛ بنابراین برای کاراکترهای یونیکد فراتر از بایت واحد باید از روشهای دیگر استفاده کنید.
- برای معکوس این تبدیل میتوان از ord() استفاده کرد.
نمونههای ساده
<?php
echo chr(65); // 'A'
echo chr(10); // newline (LF)
echo ord(chr(65)); // 65
echo bin2hex(chr(255)); // "ff"
?>این کدها نشان میدهند که chr(65) حرف ‘A’ را تولید میکند، chr(10) کاراکتر newline را میسازد و ord خروجی را به عدد برمیگرداند. bin2hex کمک میکند مقادیر بایتی غیرقابلچاپ را ببینید.
کاربردهای عملی
- ساخت رشتههای باینری برای پروتکلهای شبکه یا فایلهای باینری (مثلاً headerهای مختص فایلها).
- تولید کاراکترهای کنترلی مثل NUL (chr(0))، TAB (chr(9)) و ESC (chr(27)).
- ایجاد مقادیر هِکسا یا توالیهای بایتی برای تستها و واحدتست.
- کار با توابع سطح پایین مانند pack/unpack برای تبدیل آرایهٔ اعداد به رشتهٔ باینری.
مثال: ساخت رشتهٔ باینری از آرایهٔ کدها
<?php
$codes = [0x48, 0x65, 0x6C, 0x6C, 0x6F]; // "Hello"
$str = implode('', array_map('chr', $codes));
echo $str; // Hello
// جایگزین سریعتر و بهینه با pack
$str2 = pack('C*', ...$codes);
echo $str2; // Hello
?>در این مثال ابتدا با استفاده از array_map و chr آرایهٔ کدها را به رشته تبدیل کردهایم. سپس نسخهٔ بهینهتر که از pack(‘C*’, …) استفاده میکند نشان داده شده است؛ pack برای تبدیل تعداد زیادی کد به یک رشته باینری معمولاً کارایی و خوانایی بهتری دارد.
تفاوت با یونیکد و استفاده از mb_chr
chr() تنها یک بایت برمیگرداند؛ بنابراین برای کاراکترهای یونیکد (مثل ایموجیها یا حروف خارج از 0–255) مناسب نیست. اگر نیاز دارید از یک code point یونیکد یک کاراکتر بسازید باید از توابع چندبایتی استفاده کنید، مانند mb_chr (در صورت فعال بودن افزونهٔ mbstring و نسخهٔ PHP که آن را پشتیبانی میکند) یا روشهای دیگری مثل اینترنتنال (intl) یا JSON/HTML entities.
<?php
// اگر mbstring فعال باشد:
echo mb_chr(0x1F600, 'UTF-8'); // 😀 (اگر محیط نمایش از UTF-8 پشتیبانی کند)
?>این مثال نشان میدهد چگونه یک code point یونیکد را با mb_chr به یک رشتهٔ UTF‑8 تبدیل کنیم. توجه کنید برای این کار باید سیستم و خروجی شما UTF‑8 را پشتیبانی کند.
نکات تخصصی و خطاهای متداول
- مقادیر منفی: chr(-1) برابر با chr(255) خواهد بود (modulo 256 اعمال میشود).
- مقادیر بزرگتر از 255: مثل chr(300) در واقع chr(44) ایجاد میکند (300 % 256 == 44).
- رشتهٔ برگشتی ممکن است شامل NUL (“”) باشد که در بسیاری از توابع رشتهای رفتار ویژهای دارد؛ بنابراین در مقایسهها از === استفاده کنید و مراقب طول رشته باشید.
- برای ترکیب تعداد زیادی بایت از pack یا روشهای اختصاصی استفاده کنید تا از نظر کارایی بهینه باشید.
- chr برای تولید کاراکترهای غیرقابلچاپ وقتی با bin2hex یا unpack بررسی میشود مفید است.
نمونهٔ کاربرد در پروتکل شبکه (ارسال بستهٔ ساده)
<?php
$version = chr(1);
$type = chr(2);
$length = pack('n', 5); // unsigned short (big-endian) length = 5
$payload = "Hello";
$packet = $version . $type . $length . $payload;
// سپس $packet را در سوکت ارسال کنید
?>در این مثال یک بستهٔ ساده شامل یک بایت نسخه، یک بایت نوع، دو بایت طول (big-endian) و یک payload ساخته شده است. از chr برای تولید بایتهای کمسایز و از pack برای تبدیل اعداد چندبایتی استفاده شده است.
جدول نمونه کدها
| کد | کاراکتر | توضیح |
|---|---|---|
| 0 | NULL | کاراکتر خاتمهدهندهٔ رشته در برخی پروتکلها |
| 9 | TAB | تب افقی |
| 10 | LF | line feed (new line) |
| 27 | ESC | escape control (کنترل ترمینال) |
| 65 | A | حرف بزرگ A |
| 255 | 0xFF | آخرین مقدار یک بایت |
توصیههای نهایی و بهترین شیوهها
- اگر با متن قابلنمایش یونیکد کار میکنید، از mb_chr و mbstring یا روشهای مناسب UTF‑8 استفاده کنید، نه chr.
- برای تولید توالیهای بایتی طولانی از pack(‘C*’, …) یا buffer-building بهره ببرید تا کارایی بالا رود.
- در زمان کار با دادههای باینری مراقب کاراکترهای NUL و مقایسههای رشتهای باشید.
- در خروجیهایی که مرورگر یا ترمینال میگیرند، تزریق کاراکترهای کنترلی ممکن است خطرناک باشد؛ ورودیها را سانیتیزه کنید.
توابع سادهای مثل chr() در اپلیکیشنهای واقعی نقشهای مهمی ایفا میکنند، به شرطی که محدودیتهای بایت-محور بودنشان را در برابر یونیکد و نیازهای باینری درک کنیم و از ابزار مناسب (pack، mb_chr، ord و غیره) در موقعیت درست استفاده کنیم.
آیا این مطلب برای شما مفید بود ؟



