PDA

View Full Version : برای رفع این مشکل راهنمایی کنید.مربوط به رشته های فارسی هست



white tower
جمعه 25 اردیبهشت 1394, 16:01 عصر
با درود
مشکلم رو توضیح میدم.اگر طولانی شد بخاطر اینه که می خوام متوجه بشید.

من می خوام یه سری اطلاعات از یه سایت فارسی خارج کنم.البته کپی برداری و این حرفا نیست.خیالتون راحت.اطلاعات دریافتی فارسیه و همه چی بخوبی انجام میشه.مشکل در رشته دریافتی مربوط به نام ماه است.تاریخ رو بصورت 09 اردیبهشت 94 درج کردن بطور مثال.من رشته رو می گیرم و با explode قسمتهاش رو جدا می کنم و وقتی نام ماه رو چاپ می کنم اردیبهشت چاپ میشه.حالا می خوام همین مقدار رشته ای رو به عدد متناظر با رشته ماه که همون 2 باشه تبدیل کنم.رشته رو به یه تابع که توش یه سری if گذاشتم ارسال می کنم و با این کد


if(!strcmp($var, 'اردیبهشت')){
return '2';
}

بررسی می کنم که اگر مقدار برابر بود عدد متناظرش رو برگردونه.مقادیر درست ارسال می شه ولی هیچ کدوم از if ها برای هیچ نام ماهی مقدار برنمی گردونن.

این تابع مربوط به تبدیل نام ماه به عددش که خلاصه اش رو گذاشتم


function to_int_months($var){
if(!strcmp($var,'فروردين')){
return '1';
}
if(!strcmp($var,'اردیبهشت')){
return '2';
}
.
.
.

وقتی کد زیر اجرا میشه مقدار رشته نام ماه چاپ میشه و جلوش هیچی نمیاد یعنی تبدیل نشده(باید عدد متناظرش چاپ بشه).وقتی نام ماه چاپ شده رو به عنوان پارامتر ارسال می کنم به تابع مقدار متناظرش برمی گرده و 2 بطور مثال چاپ میشه.

echo $arr[1].'=-='.to_int_months($arr[1]);

میشه راهنمایی کنید که کجای کارم مشکل داره یا چطوری می تونم این کار رو انجام بدم یعنی تبدیل رشته ماه فارسی به عدد متناظرش.
ممنون

under22
جمعه 25 اردیبهشت 1394, 16:13 عصر
به این شکل باید کدتون کار کنه اما شاید فاصله بین کلمه ها هست شما trim هم انجام بدید
درضمن میتونید مقایسه تون رو به این شکل مانند اعداد هم انجام دهید


if($var=='test'){
return 1;
}

قبل اجرا یه var_dump از متغییر بگیرید و چک کنیدکه فاصله نداشته باشه و نوعش string باشه

white tower
جمعه 25 اردیبهشت 1394, 19:04 عصر
trim رو قبل از ارسال مقدار به تابع زدم و == رو هم امتحان کردم ولی جواب نداد.در ضمن مقدار رشته ها هم همگی string هست.

m_r_1989
جمعه 25 اردیبهشت 1394, 22:28 عصر
بهترین راه این هست که شما از switch استفاده کنید اصولا switch برای این کار استفاده می شود

amin1softco
جمعه 25 اردیبهشت 1394, 22:36 عصر
مشکل از کارکتر های فارسی است
http://stackoverflow.com/questions/14655092/comparing-utf-8-string
http://php.net/manual/de/class.collator.php

rezakho
جمعه 25 اردیبهشت 1394, 22:55 عصر
مشکل از کاراکترهای فارسی و ... نیست، مشکل از اون بی وجدان هایی هست که نگاره های فارسی رو در فهرست یونیکد نگاره های عربی آوردند و چندین شکل برای حروف درآوردند.

مثلا ما چندین نوی "ی" داریم که کد هر کدام با دیگری متفاوت هست، چندین نوع ه و ...، پس طبیعی هست که شرط شما false برگردونه.

این چند نمونه "ﯼ ی ﻱ ﯼ" که اگر کد هر کدوم رو چاپ کنید با دیگری متفاوته.

شما باید برای مقایسه، اصل رشته "اردیبهشت" رو از همون منبع بگیرید و در کدتون استفاده کنید.

m_r_1989
جمعه 25 اردیبهشت 1394, 23:35 عصر
من این کد رو نوشتم همین الان و کاملا درست داره جواب می ده

<?php
if (isset($_POST['submit'])){
switch ($_POST['text']) {

case 'اردیبهشت' :
echo 'ok';

break;
case 'مهر' :
echo 'ok';

break;
case 'فروردین' :
echo 'ok';

break;
}


}
?>
<html>
<meta charset="utf-8"/>
<body>
<form action="" method="post">
<input type="text" name="text" >
<input name="submit" type="submit">
</form>

</body>
</html>
همون طور که گفتم از switch استفاده بشه هیچ مشکلی ندارید