PDA

View Full Version : مبتدی: مشکلات حروف فارسی چندگانه



Alireza.AM
چهارشنبه 13 دی 1391, 12:09 عصر
برخی از حروف فارسی به چند شکل و به اصطلاح بر اساس Character Set های مختلف نوشته می‌شوند
مثلا:

"ک" و "ك"
"ی" و "ي"

که در اصل شکل‌های دوم عربی هستند

حالا اگر در پایگاه داده‌های شما هردو "ک" و هردو "ی" ذخیره شده باشند باید چه‌کار کرد؟

مثلا شما می‌خواهید یک Select بنویسید که تمام کسانی که نام آنها "بابک" است را برای شما بیاورد
دو نفر با نام بابک در جدول شما ذخیره شده‌اند یکی با "ک" و دیگری با "ك"
یک روش این است که دو شرط برای Select بگذارید که هردو بابک را چک کند، ولی اگر متنی که در حال جستجوی آن هستید طولانی باشد چه؟ اصلا اگر در متن شما هم "ک" وجود داشت و هم "ی" چه؟ یعنی باید ترکیب تمام حالات مختلف را در شرطتان اعمال کنید؟

در واقع اگر مجبور باشید باید این کار را بکنید ولی به‌جای نوشتن تمام متن در حالات مختلف می‌توانید توابعی بنویسید که این کار را برای شما انجام بدهند، این کدی‌است که من از آن استفاده می‌کردم:

string MakeitFarsi(string NetString)
{
NetString = NetString.Replace((char)1705, (char)1603);
return NetString.Replace((char)1740, (char)1610);

}

این تابع کارکترهای عربی را با نظایر فارسی آنها معاوضه می‌کند

می‌توانید سه تابع دیگر هم برای جستجوی کارکترهای عربی و ترکیب آنها بنویسید، ولی پیشنهاد من این است که هنگام data entry یعنی وقتی که در حال ثبت اطلاعات در پایگاه داده‌ها هستید آنها را استاندارد سازی کنید، مثلا همه کارکترهای عربی را در آنها فارسی کنید و هنگام انجام جستجو فقط به‌دنبال کارکترهای فارسی بگردید، به‌این ترتیب یک تابع مثل تابع فوق کفایت می‌کند، البته با این شرط که همانطور که گفتم، یک بار هنگام ثبت اطلاعات از آن استفاده کنید و یک بار هم هنگام بازیابی.

morteza271
چهارشنبه 13 دی 1391, 12:16 عصر
فکر کنم اگه به این صورت کوئری Select نوشته بشه مشکل این حروف برطرف میشه و هردو رو پیدا میکنه :
Select * From Persons Where FName=N'بابک'
و دیگه نیازی به این تابع هم نیست!!!!
موفق باشید

Alireza.AM
چهارشنبه 13 دی 1391, 12:43 عصر
اگر اشتباه نکنم N مربوط به National language character set یا همون Unicode هستش ولی مساله اینه که رشته ما unicode نیست

morteza271
چهارشنبه 13 دی 1391, 13:19 عصر
اگر اشتباه نکنم N مربوط به National language character set یا همون Unicode هستش ولی مساله اینه که رشته ما unicode نیست
من که تست کردم و درست بود!
منم قبلا همین مشکل حروف ک و ی برام پیش اومده بود و حتی یه تابع هم پیدا کردم که حروف رو تبدیل میکرد و ...
ولی یه جا این استفاده از N رو دیدم و امتحان کردم درست شد!!!

Alireza.AM
چهارشنبه 13 دی 1391, 13:26 عصر
ممنونم. خیلی خوبه اگر به همین راحتی حل بشه. فقط من نمیتونم دلیلش رو بفهمم! باید امتحانش کنم و یه کم هم بهش فکر کنم. مرسی

morteza271
پنج شنبه 14 دی 1391, 10:26 صبح
ممنونم. خیلی خوبه اگر به همین راحتی حل بشه. فقط من نمیتونم دلیلش رو بفهمم! باید امتحانش کنم و یه کم هم بهش فکر کنم. مرسی
اقا من شرمندم!!!
دوباره که بیشتر بررسی کردم متوجه شدم حرف شما درسته!!! من اشتباه کردم!
شرایطی که دفعه ی قبل پیش اومده بود با این شرایط فرق میکرد!!!
فکر کنم برای رفع این مشکل باید از همین تابعی که گذاشتین استفاده کرد!!!

Alireza.AM
پنج شنبه 14 دی 1391, 10:35 صبح
خواهش می‌کنم، این حرفا چیه. کدی که شما نوشتید درسته و خوب هم کار میکنه ولی مربوط به مساله حروف چندگانه نمیشه. شما هروقت که بخواهید توی Where clause یک رشته Unicode مثلا فارسی بگذارید باید از اون N استفاده کنید تا Database Server بفهمه که شما دارید دنبال کارکترهای Unicode میگردید ولی فقط همون ASCII Code رو Search میکنه که توی رشته اومده نه هیچ کد دیگه‌ای رو.

موفق باشید دوست من

Alireza.AM
پنج شنبه 14 دی 1391, 10:37 صبح
ممنون از اینکه لطف کردید و نتیجه رو اینجا به ما اطلاع دادید. مرسی

morteza271
جمعه 15 دی 1391, 08:49 صبح
خواهش می‌کنم، این حرفا چیه. کدی که شما نوشتید درسته و خوب هم کار میکنه ولی مربوط به مساله حروف چندگانه نمیشه. شما هروقت که بخواهید توی Where clause یک رشته Unicode مثلا فارسی بگذارید باید از اون N استفاده کنید تا Database Server بفهمه که شما دارید دنبال کارکترهای Unicode میگردید ولی فقط همون ASCII Code رو Search میکنه که توی رشته اومده نه هیچ کد دیگه‌ای رو.

آره درسته.

حالا یه سوال :
از اون تابعی که در پست اول گذاشتین چطوری باید استفاده کرد؟؟
نمیدونم من اشتباه ازش استفاده کردم یا اینکه درست کار نمیکنه!!!
میشه یه مثال بزنید...

par3eh
جمعه 15 دی 1391, 09:18 صبح
سلام.
ببخشید نمیشه توی پایگاه داده collation ستونمونو persian_100_bin ست کنیم؟
من توی کارای خودم اینکارو میکنم و مشکلی هم با حروف فارسی ندارم.....

Alireza.AM
جمعه 15 دی 1391, 10:03 صبح
دوست عزیز، Morteza271

تابعی که من نوشتم فقط یک مثال در مورد دوحالت برای "ک" و دو حالت برای "ی" هستش که البته معمولا این دو حرف توی Select مشکل ایجاد میکنند ولی ممکنه شما نیاز داشته باشید که کارکترهای دیگه‌ای رو بهش اضافه کنید.

درواقع این تابع قراره که مثلا "ی" های مختلف با کدهای ASCII مختلف رو در یک رشته پیدا بکنه و همه رو با یک "ی" با کد ASCII دلخواه شما عوض کنه همین.

می‌تونید این تابع رو بنویسید و هرجا که خواستید اون رو call کنید، بهش رشته رو به عنوان ورودی بدید و ازش خروجی بگیرید. مثلا:

فرض کنید که دو تا متغیر رشته ای دارید به نام های: str1 و str2

str1 با یک رشته پر شده که توش "ی" ها و "ک" های مختلف فارسی و عربی با کدهای ASCII مختلف وجود داره و شما میخواهید در str2 رشته تصحیح شده رو بریزید:

str2 = MakeitFarsi( str1);

ممکنه این سوال براتون پیش بیاد که اصلا چرا باید چنین اتفاقی بیفته؟!

فرض کنید که یک Website ساختید که به کاربرهای مختلف اجازه میده که باهاش یک فیلد رو توی database که روی اینترنت host کردید ویرایش کنند. کاربرهای مختلف با فونتهای مختلفی که روی کامپوترهای خانگیشون نصب کردن فیلد شمارو ویرایش میکنند. یعنی ممکنه یکی "ی" فارسی وارد فیلد شما کرده باشه و یک نفر دیگه "ی" عربی هم بهش اضافه بکنه. حالا دیگه دوتا "ی" مختلف با کدها ASCII مختلف توی فیلدتون دارید.
به نظر من بهتره که از این تابع وقت data entry استفاده بشه. یعنی اول همه کارکترهای مورد نظر همانند سازی بشن و بعد توی پایگاه داده ها ذخیره بشن.

میتونید اصلا از تابع هم استفاده نکنید و کد داخلش رو مستقیما وسط کدهاتون استفده کنید که البته من این شیوه رو زیاد دوست ندارم :-)

Alireza.AM
جمعه 15 دی 1391, 10:09 صبح
سلام دوست عزیز، Paer3eh

درسته. در هر صورت باید از collation مناسب برای character set مورد نظر استفاده کرد. مساله ای که من بهش اشاره کردم فقط وقتی پیش میاد که پایگاه داده های شما توسط کابرهای مختلف از دستگاههای مختلف با فونت ها و character های مختلف با کدهای ASCII مختلف ویرایش بشه. حتی یک Collation مناسب هم به کاربرها اجازه میده که خیلی از character هارو با کدهای ASCII مختلف توی پایگاه داده ها ذخیره کنند. حتی ممکنه ما توی فونتها فارسی هام از یک character چند نمونه با چندتا کد ASCII داشته باشیم.