انجمن تخصصی ایران سرور
رفع مشکل توابع رشته ای برای متن های فارسی در php - نسخه قابل چاپ

+- انجمن تخصصی ایران سرور (https://forums.irserv.ir)
+-- انجمن: بخش طراحی سایت (https://forums.irserv.ir/Forum-%D8%A8%D8%AE%D8%B4-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA--8)
+--- انجمن: بخش طراحی و راه اندازی سایت (https://forums.irserv.ir/Forum-%D8%A8%D8%AE%D8%B4-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%88-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA--28)
+---- انجمن: مباحث و منابع آموزشی ( طراحی سایت ها ) (https://forums.irserv.ir/Forum-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D9%88-%D9%85%D9%86%D8%A7%D8%A8%D8%B9-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA-%D9%87%D8%A7--29)
+---- موضوع: رفع مشکل توابع رشته ای برای متن های فارسی در php (/Thread-%D8%B1%D9%81%D8%B9-%D9%85%D8%B4%DA%A9%D9%84-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%B1%D8%B4%D8%AA%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AA%D9%86-%D9%87%D8%A7%DB%8C-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-php--7062)



رفع مشکل توابع رشته ای برای متن های فارسی در php - backendbaz - یکشنبه ۰۹ آذر ۱۳۹۹

اگر توابع مربوط به کار روی رشته ها مثل substr، str_replace، strlen، strpos و … را روی متون فارسی استفاده کنیم می بینیم که نتیجه ی اشتباهی را در خروجی برمیگرداند:
کد پی‌اچ‌پی:
$text "Hello World";
echo 
strlen($text);
// خروجی = 11

$text "خوش آمدید";
echo 
strlen($text);
// خروجی = 17 
همانطور که می بینید، در مورد کلمه انگلیسی Hello World تعداد به درستی محاسبه می شود اما در مورد جمله فارسی “خوش آمدید” که تعداد حروف آن 9 است اشتباهاً عدد 17 را چاپ می کند.
در مورد باقی توابع نیز به همین شکل است. مثلاً در مورد تابع substr که مربوط به برداشت تکه ای از متن است، علاوه بر اینکه عملیات را اشتباه انجام میدهد، بلکه حروف ناخواسته ای را نیز چاپ می کند:
کد پی‌اچ‌پی:
$text "Hello World";
echo 
substr($text 54);
// خروجی :
Wor

$text 
"خوش آمدید";
echo 
substr($text 54);
// خروجی :
� آ 
برای برطرف کردن این مشکل به جای توابع substr، str_replace، strlen، strpos و … از توابع mb_substr، mb_str_replace، mb_strlen، mb_strpos و … استفاده می کنیم.
این توابع یک ورودی اضافه نسبت به تابع اصلی دارند، که در آن انکدینگ مربوط به حروف فارسی یعنی utf-8 را باید قرار دهیم. البته اگر فایل php مان با همین انکدینگ نوشته شده باشد، نیازی به نوشتن این ورودی نیز نداریم.
کد پی‌اچ‌پی:
$text "Hello World";
echo 
strlen($text);
// خروجی = 11

$text "خوش آمدید";
echo 
mb_strlen($text);
// خروجی = 9 
یا
کد پی‌اچ‌پی:
$text "Hello World";
echo 
substr($text 54);
// خروجی :
Wor

$text 
"خوش آمدید";
echo 
mb_substr($text 54'utf-8');
// خروجی :
مدید 
 
منبعhttps://backendbaz.ir/php-tutorial/