ارسالها: 257
موضوعها: 37
تاریخ عضویت: اردیبهشت 1394
اعتبار:
2
تشکرها: 281
117 بار تشکر شده در 94 پست
اگر توجه کرده باشید حتما دیدید که یک سری توابع در PHP موجوده که با mb شروع می شوند و ما فارسی زبان ها باید encoding UTF-8 رو به عنوان پارمتر آخر بهش بدیم. مثل mb_str_replace
سوالم اینه که بعضی از این توابع مثل همین Str_replace کاملا با فارسی بدون مشکل کار میکنن و به mb_str_replace نیازی نیست. االبته بعضی از توابع مثل strlen برای کلمات فارسی نتیجه دوبرابری میدن که اشتباهه ولی امثال str_replace زیاده که با فارسی هم هیچ مشکلی ندارم. پس دلیل گذاشتن encoding و استفاده از mb_str_replace چیه؟
ارسالها: 122
موضوعها: 28
تاریخ عضویت: اردیبهشت 1394
اعتبار:
0
تشکرها: 69
36 بار تشکر شده در 26 پست
همیشه اینطوری نیست وقتی به تعداد فرد کاراکتر با این توابع کار کنید به مشکل میخورید و علامت سوال(؟) انتهای رشته ها میاد.
ارسالها: 46
موضوعها: 7
تاریخ عضویت: اردیبهشت 1394
اعتبار:
0
تشکرها: 14
54 بار تشکر شده در 29 پست
شاید php شما فرق داره(شوخی)
اگه همون تابع substr که دوستمون دادن رو با یک متن زیاد کار کنید متوجه میشید که ؟؟ نشون میده.mb میاد این مشکل ها رو بر طرف میکنه.این مشکل به خاطر دوبایتی بودن حروف پارسی هستش.(اگر اشتباه نگفته باشم)
ارسالها: 44
موضوعها: 18
تاریخ عضویت: خرداد 1394
اعتبار:
1
تشکرها: 11
24 بار تشکر شده در 19 پست
سلام
من هر چیزی که گفته از روی اون لینکی که کذاشتم گفتم که سایت php هست حالا اینکه جواب سوال شما بود یا نه رو شما می دونید. در کل عذرخواهی می کنم اگر نتونستم کمکی بکنم.
به نظره من هم استاد شهرکی جواب بسیار بهتری برای این سوال ها دارند.
تشکر
15-03-1394، 08:39 ب.ظ
(آخرین تغییر در ارسال: 15-03-1394، 08:40 ب.ظ توسط rezakho.)
ارسالها: 12
موضوعها: 3
تاریخ عضویت: اردیبهشت 1394
اعتبار:
0
تشکرها: 3
32 بار تشکر شده در 10 پست
ببینید، به طور کلی، توابع string خود php فقط برای کار با کاراکترهای ascii ساخته شده که برای هر کاراکتر یک بایت (7 یا 8 بیت) در نظر می گیره و با این توابع نمیشه روی کاراکترهای بیشتر از یک بایت مثل یونیکد کار کرد.
کاراکترهای فارسی در دامنه یونیکد تعریف شدند که برای هر کارکتر 2 بایت در نظر گرفته میشه، مثلا اگر شما با توابع خود php یک رشته فارسی رو تا 5 کاراکتر برش بزنی، عملا 2 کاراکتر رو نصفی رو برش زدی و کاراکتر آخر یا سوم! درست نشون داده نمیشه!
حالا چرا بعضی از توابع مثل همین str_replace درست کار می کنند به این دلیل هست که این تابع الگوی گرفته شده رو جایگزین می کنه و کاری به طول و نوع رشته نداره!
یعنی مثلا برای یک رشته 3 کاراکتری یونیکد، 6 کاراکتر اسکی در نظر می گیره و شروع می کنه به جایگزین کردن رشته و اصلا متوجه یونیکد بودن رشته ورودی و خروجی نمی شه!