PDA

View Full Version : مشکل تابع strlen با حروف فارسی



crafcrab
یک شنبه 27 شهریور 1390, 18:32 عصر
echo strlen("مافیا"); >>mizane 10 character
باید چیکار کنم ؟
تابع دیگه ای هست که درست کار کنه و طول رشته فارسی رو درست برگردونه

blackmak
یک شنبه 27 شهریور 1390, 20:06 عصر
utf-8 بزار صفحتو درست میشه فکر کنم


<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

billgivz
یک شنبه 27 شهریور 1390, 20:18 عصر
mb_internal_encoding('UTF-8');
$str=str_replace("\n", "", $str);
$len=mb_strlen($str);

idocsidocs
دوشنبه 28 شهریور 1390, 01:47 صبح
mb_internal_encoding('UTF-8');
$str=str_replace("\n", "", $str);
$len=mb_strlen($str);

امکانش هست در مورد کدهای بالا بیشتر توضیح بدید؟

MMSHFE
دوشنبه 28 شهریور 1390, 10:25 صبح
mb_internal_encoding('UTF-8');
echo mb_strlen('مافيا');

توضيح: توابعي كه با _mb شروع ميشن (MultiByte) مخصوص كار با داده هايي هستن كه بيش از يك بايت براي ذخيره سازي اطلاعات به كار ميبرن. مثل كاركترهاي Unicode كه دو بايتي هستند. دستور اول اعلام ميكنه از كدگذاري UTF-8 استفاده كنه و دستور دوم طول رشته رو محاسبه ميكنه. اون دستور وسطي هم كه دوست خوبم گذاشتن هم براي اطمينان هست و كارش اينه كه كاركتر NewLine (سطر جديد) رو از رشته حذف ميكنه تا اگه رشته شما حاوي اين كاركتر باشه، جزو طول رشته محسوب نشه.
موفق باشيد.

idocsidocs
دوشنبه 28 شهریور 1390, 11:43 صبح
توضيح: توابعي كه با _mb شروع ميشن (MultiByte) مخصوص كار با داده هايي هستن كه بيش از يك بايت براي ذخيره سازي اطلاعات به كار ميبرن. مثل كاركترهاي Unicode كه دو بايتي هستند. دستور اول اعلام ميكنه از كدگذاري UTF-8 استفاده كنه و دستور دوم طول رشته رو محاسبه ميكنه. اون دستور وسطي هم كه دوست خوبم گذاشتن هم براي اطمينان هست و كارش اينه كه كاركتر NewLine (سطر جديد) رو از رشته حذف ميكنه تا اگه رشته شما حاوي اين كاركتر باشه، جزو طول رشته محسوب نشه.
موفق باشيد. من توی قسمت تغییر رمز می خوام طول کلمه رمز رو مشخص کنم. کلمه رمز ممکنه یا کاملا فارسی باشه، یا کاملا انگلیسی و یا مخلوط باشه.

اگر توی توابعی که برای مالتی بایت هستن از حروف انگلیسی استفاده کنم، آیا مشکلی در شمردن صحیح تعداد حروف پیش نمی یاد؟

binyaft
دوشنبه 28 شهریور 1390, 11:49 صبح
نه نمیاد .
تست هم میکردی عالی بود .

idocsidocs
دوشنبه 28 شهریور 1390, 15:09 عصر
تست هم میکردی عالی بود . اگه قضیه مثال نقض رو شنیده باشی متوجه می شی چرا تست نکردم !

binyaft
دوشنبه 28 شهریور 1390, 20:40 عصر
http://fa.wikipedia.org/wiki/%D9%85%D8%AB%D8%A7%D9%84_%D9%86%D9%82%D8%B6

حروف انگلیسی استفاده کنم
این کجا و آن کجا!!!!
مثل این میمونه بگیم حرف ف در حروف فارسی دو بایت جا میگیره اما حرف س یکی یا سه تا!!!
میشه ؟
اما مثل همون لینک ویکی میشه گفت دانش آموزان تنبل هستند ، اگر یکی زرنگ باشه پس هیچی ...
حروف لاتین که دانش آموز نیستن بگیم همه یک بایت جا میگیرن ، حالا B از این بین بیاد 2 بایت جا بگیره!!!


بعد توابع منطقی هستن! وقتی میگه MultiByte ـه این نیست که برای یک حرف B اینطور نباشه ;)

از این به بعد مثال میزنی نیگا کن چیو مثال میزنی ;)

A B C D
دوشنبه 28 شهریور 1390, 21:03 عصر
اگر توی توابعی که برای مالتی بایت هستن از حروف انگلیسی استفاده کنم، آیا مشکلی در شمردن صحیح تعداد حروف پیش نمی یاد؟ هیچ مشکلی نداره.
ضمنا در انکدینگ UTF-8 کاراکترهای ASCII همون یک بایت رو اشغال میکنن. تعداد بایتهای اختصاص یافته برای کاراکترهای مختلف یونیکد در این انکدینگ متغییر است و میتونه از 1 تا 4 بایت بسته به Code point کاراکتر مورد نظر باشه.
اما فرضا در فرمت UTF-16 از دو بایت ثابت برای تمام کاراکترها استفاده میشه.
البته انکدینگ های یونیکد جزییات دیگر و روشهای توسعه هم دارن (چون همهء کاراکترهای یونیکد در دو بایت جا نمیشن) که دیگه یادم نیست.