رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
دلیل استفاده از توابعی که با mb شروع میشوند؟
#1
اگر توجه کرده باشید حتما دیدید که یک سری توابع در PHP موجوده که با mb شروع می شوند و ما فارسی زبان ها باید encoding UTF-8 رو به عنوان پارمتر آخر بهش بدیم. مثل mb_str_replace

سوالم اینه که بعضی از این توابع مثل همین Str_replace کاملا با فارسی بدون مشکل کار میکنن و به mb_str_replace نیازی نیست. االبته بعضی از توابع مثل strlen برای کلمات فارسی نتیجه دوبرابری میدن که اشتباهه ولی امثال str_replace زیاده که با فارسی هم هیچ مشکلی ندارم. پس دلیل گذاشتن encoding و استفاده از mb_str_replace چیه؟
پاسخ
تشکر شده توسط:
#2
همیشه اینطوری نیست وقتی به تعداد فرد کاراکتر با این توابع کار کنید به مشکل میخورید و علامت سوال(؟) انتهای رشته ها میاد.
پاسخ
تشکر شده توسط: sorkhabi
#3
(14-03-1394، 10:42 ق.ظ)hamid نوشته: همیشه اینطوری نیست وقتی به تعداد فرد کاراکتر با این توابع کار کنید به مشکل میخورید و علامت سوال(؟) انتهای رشته ها میاد.

متوجه منظورتون نشدم! یعنی اگر کلمه "علی" رو که 3 کاراکتر هست و یک عدد فرده با str_replace جایگزینیش کنیم آخرش (؟) میاد؟؟!!
پاسخ
تشکر شده توسط:
#4
تست کنید متوجه میشید
$data = 'سلام، ';
		echo mb_substr($data, 0, -2, 'UTF-8') . '<br>';
		echo substr($data, 0, -2);
پاسخ
تشکر شده توسط: php , sorkhabi
#5
(14-03-1394، 12:28 ب.ظ)n0o0b_sina نوشته: تست کنید متوجه میشید
$data = 'سلام، ';
		echo mb_substr($data, 0, -2, 'UTF-8') . '<br>';
		echo substr($data, 0, -2);

تست کردم، جواب هر دو حالت "سلام" بود بدون هیچ تفاوتی!
البته خودم احتمال میدم توی substr با کلمات فارسی مشکل داشته باشه، همونطور که توی پست اول گفتم کلمات فارسی چون دو بایت هستن برخلاف کلمات لاتین که یک بایت هستن، واسه همین توابعی مثل strlen جواب اشتباه میدن واسه کلمات فارسی، و احتمال میدم substr هم که بر مبنای تعداد کارکتر هستش واسه کلمات فارسی مشکل داشته باشه.
پاسخ
تشکر شده توسط:
#6
شاید php شما فرق داره(شوخی)
اگه همون تابع substr که دوستمون دادن رو با یک متن زیاد کار کنید متوجه میشید که ؟؟ نشون میده.mb میاد این مشکل ها رو بر طرف میکنه.این مشکل به خاطر دوبایتی بودن حروف پارسی هستش.(اگر اشتباه نگفته باشم)
پاسخ
تشکر شده توسط: php , meysam1366 , sorkhabi
#7
سلام دوستان
نیاز نیست این همه سر خودتونو درد بیارین توی سایت خود پی اچ پی تفاوت ها رو کامل واضح توضیح داده به این لینک مراجعه کنید.
همون اولش اگه دقت کنید گفته mb_substr یک بخش از رشته رو می گیره حالا اگر به substr دقت کنید گفته یک بخش از رشته رو بر می گردونه .
توضیحات بعدی که خیلی واضح گفته اول اینکه mb اولش به معنی multi-byte هست و اینکه حالا این مالتی بایته امن هم هست و بر پایه شمارش کاراکتر ها انجام می شود و اینکه کارکتر اول رو صفر در نظر می گیره و بعدی رو یک و....
حالا توی substr گفته که رشته ای رو که مشخص می کنیم با استفاده از شروع و طول اون بر می گردونه.
پاسخ
تشکر شده توسط: php
#8
(15-03-1394، 03:44 ب.ظ)php_programmer021 نوشته: سلام دوستان
نیاز نیست این همه سر خودتونو درد بیارین توی سایت خود پی اچ پی تفاوت ها رو کامل واضح توضیح داده به این لینک مراجعه کنید.
همون اولش اگه دقت کنید گفته mb_substr یک بخش از رشته رو می گیره حالا اگر به substr دقت کنید گفته یک بخش از رشته رو بر می گردونه .
توضیحات بعدی که خیلی واضح گفته اول اینکه mb اولش به معنی multi-byte هست و اینکه حالا این مالتی بایته امن هم هست و بر پایه شمارش کاراکتر ها انجام می شود و اینکه کارکتر اول رو صفر در نظر می گیره و بعدی رو یک و....
حالا توی substr گفته که رشته ای رو که مشخص می کنیم با استفاده از شروع و طول اون بر می گردونه.

دوست عزیز جواب شما رو چندبار خوندم ولی جواب سوال من این نبود! شما به نظر تفاوت substr و strreplace رو گفتید!
حالا منتظر میمونم آقای شهرکی هم بیان نظرشونو بدن چون فکر کنم توی این زمینه کار کردن، یکسالی پیش یادم میاد توی یک تاپیکی به کسی گفتن به جای فلان تابع از mb اون استفاده کن...

البته خودم سرچ کنم دوباره، گفته شده بود که از بین توابعی که با mb شروع میشن، بدون mb ها فقط همین str_replace با فارسی مشکل نداره و اون هم به شرط اینکه تمام حروف هر 3 آرگومان تابع فارسی باشن! حالا درستی یا غلطی این موضوع رو نمیدونم!
پاسخ
تشکر شده توسط:
#9
سلام
من هر چیزی که گفته از روی اون لینکی که کذاشتم گفتم که سایت php هست حالا اینکه جواب سوال شما بود یا نه رو شما می دونید. در کل عذرخواهی می کنم اگر نتونستم کمکی بکنم.
به نظره من هم استاد شهرکی جواب بسیار بهتری برای این سوال ها دارند.
تشکر
پاسخ
تشکر شده توسط: php
#10
ببینید، به طور کلی، توابع string خود php فقط برای کار با کاراکترهای ascii ساخته شده که برای هر کاراکتر یک بایت (7 یا 8 بیت) در نظر می گیره و با این توابع نمیشه روی کاراکترهای بیشتر از یک بایت مثل یونیکد کار کرد.

کاراکترهای فارسی در دامنه یونیکد تعریف شدند که برای هر کارکتر 2 بایت در نظر گرفته میشه، مثلا اگر شما با توابع خود php یک رشته فارسی رو تا 5 کاراکتر برش بزنی، عملا 2 کاراکتر رو نصفی رو برش زدی و کاراکتر آخر یا سوم! درست نشون داده نمیشه!

حالا چرا بعضی از توابع مثل همین str_replace درست کار می کنند به این دلیل هست که این تابع الگوی گرفته شده رو جایگزین می کنه و کاری به طول و نوع رشته نداره!

یعنی مثلا برای یک رشته 3 کاراکتری یونیکد، 6 کاراکتر اسکی در نظر می گیره و شروع می کنه به جایگزین کردن رشته و اصلا متوجه یونیکد بودن رشته ورودی و خروجی نمی شه!
پاسخ
تشکر شده توسط: php , __undercover
#11
http://sourceforge.net/projects/php-proxy
پاسخ
تشکر شده توسط:
#12
ببینید، توابع با پیشوند mb بطور خاص برای رشته هایی درنظر گرفته شدن که کارکترهای MultiByte دارن (مثل یونیکد و...). حالا اگه توی تنظیمات PHP کدگذاری پیشفرض روی Unicode تنظیم شده باشه، توابع معمولی هم ممکنه مثل mb ها کار کنن ولی این به معنای کارکرد صحیح و صددرصد اون توی تمام هاستها و سرورها نیست. پس بهتره روزه شک دار نگیرین و اگه جایی با حروف فارسی سروکار دارین، از mb ها استفاده کنید. ضمناً برای اینکه سینتکس mb ها شبیه نسخه معمولی بشه و لازم نباشه هربار کدگذاری رو تعریف کنید، از mb_internal_encoding استفاده کنید. مثال:
mb_internal_encoding('utf-8');
$tablePos = mb_strpos($text, '<table>');
$string = mb_substr($text, $tablePost, -1 * mb_strpos($text, '</table>' + mb_strlen('</table>'), $tablePos));
پاسخ
تشکر شده توسط: sorkhabi , php




کاربران در حال بازدید این موضوع: 1 مهمان