PDA

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



bftarane
شنبه 08 شهریور 1393, 16:03 عصر
سلام. من در یکی از جداول عناوین منو رو در نگهداری می کنم، کاربر هم اصرار داره این عناوین مرتب باشند مثلاً: ویزا هتل من order by رو بر اساس Title نوشتم ولی متوجه شدم در بعضی مواقع مرتب سازی درست نیست مثلاً کلماتی که با ک شروع می شدن بر اساس مرتب سازی صحیح قرار نمی گرفتن. تا این لینک رو پیدا کردم و با کمک پست 13 اومدم همه ک ها رو با ک عربی تعویض کردم و مشکل ک حل شد،گرچه همین هم به نظر شیوه ایده آلی نمی رسه. http://barnamenevis.org/showthread.php?2664 ولی حالا با همون ویزا و هتل مشکل دارم که نمی دونم ایراد از و هست یا ه حتی زبان سیستم رو هم به عربی تغییر دادم و این کلمات رو در نات پد زدم و در دیتابیس کپی کردم بازم نتیجه نداد.

ولی خیلی جالبه یه صفحه جستجو هم دارم که وقتی همین دو کلمه ویزا، هتل رو سرچ می زنم در نتیجه می یارتشون.
لطفاً راهنمایی کنید.

amirzazadeh
شنبه 08 شهریور 1393, 20:22 عصر
سلام
دي ال ال مربوط به صفحه كليد رو با نوع عربي در حالت safe mode عوض كنيد مشكل برطرف ميشه.(داخل پوشه \WINDOWS\system32) البته همه حروف "ی" فارسي هم بايد با " ي " عربي جايگزين كنيد.
اينم فايلdll

Rasool-GH
یک شنبه 09 شهریور 1393, 07:14 صبح
من تا به حال در مرتب سازی با حرف ه مشکل نداشتم .
یک راه دیگه هم که میتونم پیشنهاد کنم که به جای DLL میشه استفاده کرد اینه که در تمام فرمهایی که برای ورود اطلاعات استفاده میکنید یک کد برای کنترل کاراکترهای ورودی بنویسید که کلیه حروف ک و ی رو به فارسی یا به عربی تبدیل کنه و اطلاعات یکدست بشه .

Rasool-GH
یک شنبه 09 شهریور 1393, 07:39 صبح
میتونید از این کد به عنوان تابع استفاده کنید


Public Function KafYa(Key As Integer) As Integer
If Key = 1740 Or Key = 1609 Then
KafYa = 1610
ElseIf Key = 1603 Then
KafYa = 1705
ElseIf Key = 8204 Then
KafYa = 32
Else
KafYa = Key
End If
End Function

Rasool-GH
یک شنبه 09 شهریور 1393, 09:12 صبح
ضمنا در صورتی که با ه مشکل دارین میتونین از این کد استفاده کنین .کد اسکی 1728 و 1577 رو به 1607 تبدیل کنید که کد اسکی ه فارسیه.
جالبه تا به حال به این مورد بر خورد نداشتم .

bftarane
یک شنبه 09 شهریور 1393, 21:54 عصر
سلام
دي ال ال مربوط به صفحه كليد رو با نوع عربي در حالت safe mode عوض كنيد مشكل برطرف ميشه.(داخل پوشه \WINDOWS\system32) البته همه حروف "ی" فارسي هم بايد با " ي " عربي جايگزين كنيد.
اينم فايلdll
هر چی سعی کردم در پوشه System32 اجازه کپی نداد با اینکه با یوزر Administrator وارد شده بودم ولی فردا سر کار امتحان می کنم و نتیجه رو می گم.


میتونید از این کد به عنوان تابع استفاده کنید


Public Function KafYa(Key As Integer) As Integer
If Key = 1740 Or Key = 1609 Then
KafYa = 1610
ElseIf Key = 1603 Then
KafYa = 1705
ElseIf Key = 8204 Then
KafYa = 32
Else
KafYa = Key
End If
End Function


با روش شما متوجه نشدم چطور به فرض کلمه مورد نظر رو در تکست باکس وارد می کنیم کد حروفش رو باید به دست بیاریم و با کد مورد نظر خودمون جایگزین کنیم.
شاید در ویندوز فرم منظور شما بوده باشه.
من ویندوز فرم کار نمی کنم، وب اپلیکیشن کار می کنم، و در وب اپلیکیشن هم تا جایی که اطلاع دارم فقط با استفاده از جاوااسکریپت میشه کد حروف تایپ شده رو گرفت نه به صورت سرور ساید.
بازم بیشتر در موردش تحقیق می کنم اگه به نتیجه برسم اعلام می کنم.

amirzazadeh
دوشنبه 10 شهریور 1393, 07:41 صبح
هر چی سعی کردم در پوشه System32 اجازه کپی نداد با اینکه با یوزر Administrator وارد شده بودم ولی فردا سر کار امتحان می کنم و نتیجه رو می گم
.
براي ابن كار موقع بالا آمدن ويندوز كليد F8 يا ‍CTL+F8 رو فشار بديد و از صفحه بوت گزينه SAFE MODE رو انتخاب كنيد.در اين حالت ويندوز اجازه جايگزيني dll رو ميده.

bftarane
دوشنبه 10 شهریور 1393, 10:02 صبح
بله با Safe mode کار کرده بودم.
متوجه شدم این dll که گذاشتید در ویندوز xp در حالت Safe mode کپی میشه ولی در سون نه.
ولی به هر حال در سیستم همکارم (xp) که کپی کردم و تست کردم مشکل حل نشد.
این لینک هم نتیجه ای نداد
http://fa.komeil.com/blog/chortkeh-persian-keyboard-kbdfa-dll-windows-7

ولی احتمال می دم اگه بگردم و نسخه مناسب این Dll رو بتونم پیدا کنم مشکل رفع بشه. چون تا جایی که می دونم نسخه درست این Dll باید باعث بشه وقتی Shift و فاصله رو باهم می گیریم به جای فاصله کامل نیم فاصله بیفته ولی تست کردم این اتفاق نیفتاد.
باز سر فرصت رو این قضیه کار می کنم در صورتی که نتیجه گرفتم می گم.

Rasool-GH
دوشنبه 10 شهریور 1393, 19:47 عصر
بله منظورم فرم بود . در فرم با این پروسه کاملا جلوی ورود کاراکترهای غیر مجاز رو گرفتم و جدول از لحاظ کاراکترهای فارسی عربی یکسان هست
در این مورد هم شما میتونین همین پروسه رو طی کنید . چون شما به هر حال این باگ رو خواهید داشت که اگه با سیستمی فاقد Dll مورد نظرتون بخواین کار کنین مشکل باقیست .

bftarane
دوشنبه 10 شهریور 1393, 23:02 عصر
چون شما به هر حال این باگ رو خواهید داشت که اگه با سیستمی فاقد Dll مورد نظرتون بخواین کار کنین مشکل باقیست .

بله. دقیقاً قبل از اینکه پستتون رو بخونم داشتم به همین قضیه فکر می کردم، پس اون Dll نمی تونه راه حل مشکل باشه.
سوال من در این قسمت از کد شماست

Public Function KafYa(Key As Integer) As Integer
من نمی دونم شما اون key رو چطور از کلمه ای که کاربر تایپ می کنه استخراج می کنید و فکر هم نمی کنم در وب اپلیکیشن بشه همچین کاری انجام داد.
ولی این کار رو می تونم انجام بدم

private string toArabic(string SQLstr) {
SQLstr = SQLstr.Replace(
"ی", "ي");
SQLstr = SQLstr.Replace(
"
ک
", "
ك
");


return SQLstr.Trim();
}
الأن فقط نمی دونم برای و و ه نمی دونم معادل حرف عربی رو از کجا بیارم.
دیگه اینکه
من اگه بخوام اینا رو به عربی تبدیل کنم هم باز راه درستی نیست. فرضاً من نمی خوام اگه معادل واو فارسی واو همزه دار عربی باشه
ویزا به این شکل در دیتابیسم درج بشه ؤيزا یا نمی خوام ه به صورت ه دو نقطه دار در دیتابیسم درج بشه.

و یه سوال دیگه در این لینک
http://office.microsoft.com/en-001/access-help/troubleshoot-sorting-HP005188128.aspx
گفته شده
Some languages that were once listed separately are now included in the General option
که داره میگه زبانهایی مثل فارسی، ... در همون General نهفته هستند. دیتابیسم رو هم که چک کردم روی همون General بود، یعنی در واقع الآن باید تشخیص بده که دیگه به فارسی مرتب کنه ولی چرا تشخیص نمیده و میره به عربی مرتب می کنه؟
ممنون. در هر صورت فکر کنم قضیه کمی برام روشن تر شده ولی هنوز گیجم.

Rasool-GH
سه شنبه 11 شهریور 1393, 06:53 صبح
سلام
اگه وقت کنم سعی میکنم یک نمونه براتون اماده کنم . روند به این شکله که در فرم از واقعه on key press استفاده میشه . یعنی هر کلیدی که کاربر فشار میده اول به تابع میره بررسی میشه و در صورتی که هر کدوم از موارد مورد نظر باشه کد اصلاح شده برمیگرده . این بهترین حالته . حالا اگه فیلد باند شده نباشه میتونید یک تابع یا اسکریپ بنویسید که قبل از اینکه مقادیر رو ذخیره کنه کلیه کاراکترهارو بررسی کنه و کاراکترهای صحیح رو جایگزین کنه . متاسفانه با اسکریپ های وب اشنایی ندارم .
ضمنا همه کاراکترها به فارسی تبدیل میشه . فقط انحصارا از ی عربی استفاده کردم چون ی فارسی در بعضی از فونتها به صورت چسبان نیست .

Rasool-GH
سه شنبه 11 شهریور 1393, 07:29 صبح
فکر کنم این نمونه واضح باشه
تو فیلد اول هر کاراکتری رو وارد کنید کد اسکی رو میتونید ببینید

bftarane
سه شنبه 11 شهریور 1393, 11:24 صبح
http://barnamenevis.org/showthread.php?467138

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

مشکل من دقیقاً مسئله ای هست که در تاپیک زیر مطرح شده
http://elahee.ir/30993-b7ce082ae7a4311153ebd5f98ee545a6-8.html
مشکل حرف ی و ک در اینترنت خیلی مطرح شده و با همون replace حل میشه ولی مشکل (واو) و (ه) ظاهراً حل شدنی نیست.

پست 14 این لینک هم دلیل این مشکل رو توضیح میده.
http://barnamenevis.org/showthread.php?177273
من کد اسکی انواع واو و ه رو از کدوم منبع معتبر می تونم به دست بیارم؟ یه تست کردم مثلاً در یک سایت یه کد اسکی بهم داد ولی در سایت دیگه همون کد رو که می زنم یه حرف چینی ژاپنی بهم میده.
و ظاهراً اکسس می یاد و بر اساس عربی مرتب سازی رو انجام میده. (مطمئن نیستم)

Rasool-GH
سه شنبه 11 شهریور 1393, 19:33 عصر
همین نمونه ای که گذاشتم هم کد کاراکترهای مختلف رو میده هم عملکرد تابع رو نشون میده . اگه عمل نکرده واسه این بوده که عملکرد ماکروها ماژولها فعال نبوده . ضمنا کدهای اسکی به کار شما نمیاد کد یونیکد رو نیاز دارید .
شما این نسخه کامپایل شده رو بررسی کن .

Rasool-GH
سه شنبه 11 شهریور 1393, 19:36 عصر
در قسمت کاراکتر هرچی تایپ بشه کد ارسالی کیبورد نمایش داده میشه و با زدن کلید تبدیل کد اسکی و یونیکد کاراکتر نمایش داده میشه . در همون فیلد میتونید هر کاراکتری رو خواستین از جای دیگه کپی - پیس کنین و کد اون رو ببینید
در فیلد عملکرد تابع هم هر نوع ی تایپ کنید فقط ی عربی وارد میشه و هر نوع ک یا ه تایپ کنید فقط کاراکتر های فارسی وارد میشه

Rasool-GH
سه شنبه 11 شهریور 1393, 19:47 عصر
در فایل قبلی جای کد اسکی و یونیکد جابه جا بود که درست کردم .

کاراکتر ---- کد عربی ---- کد فارسی

ی -----------1610---------- 1740
--------------1609

ک-----------1603 ----------1705

ه -----------1577------------1607
-------------1728

و -----------1572 -----------1608

Rasool-GH
سه شنبه 11 شهریور 1393, 20:11 عصر
تو این نمونه هم میتونید کد رو وارد کنید و کاراکتر رو ببینید

Rasool-GH
سه شنبه 11 شهریور 1393, 20:49 عصر
اینجا هم اطلاعات خوبی هست

http://www.webtarget.ir/blog/%D9%87%D9%85%D9%87-%DA%86%D9%8A%D8%B2-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-unicode-utf8/

http://nasser.hadjloo.ir/barresi-e-sakhtar-e-unicode/

Rasool-GH
سه شنبه 11 شهریور 1393, 20:55 عصر
اینجا هم کلیه کاراکترها هستن
http://unicodinator.com/

Rasool-GH
سه شنبه 11 شهریور 1393, 21:36 عصر
ضمنا باید در تبدیل اعداد هم توجه داشته باشین
http://www.easysoft.ir/services/convertor

Rasool-GH
سه شنبه 11 شهریور 1393, 21:51 عصر
یک دستور هم درباره کاراکترهای سیستم هست که میتونید در run دستور charmap رو استفاده کنید تا کلیه کاراکترها رو ببینید


این هم جالبه

http://www.dotnettips.info/post/1774/%D8%AD%D8%B0%D9%81-%D8%A7%D8%B9%D8%B1%D8%A7%D8%A8-%D8%A7%D8%B2-%D8%AD%D8%B1%D9%88%D9%81-%D9%88-%DA%A9%D9%84%D9%85%D8%A7%D8%AA

bftarane
جمعه 21 شهریور 1393, 17:15 عصر
سلام. طبق خواست یکی از دوستان نتیجه نهایی که بهش رسیدم رو اینجا می زارم. نتیجه ای که بهش رسیدم این بود که چون کد حرف واو 1608 و کد حرف ه فارسی 1607هست پس ه می ره قبل از واو قرار می گیره موقع مرتب سازی. بنابراین دنبال حرف ه ای گشتم که کدش بزرگتر از 1608 باشه. این دو تا رو پیدا کردم 1728 ۀ 1729 ہتل این طوری مرتب سازی درست انجام میشه ولی خوب نمی خواستم ه ها به صورتی که در بالا گذاشتم نمایش داده بشه بنابراین در برنامه (زبان سی شارپ و تحت فریم ورک Asp.net) با کدهای زیر در نتیجه سورت شده مجدداً ه های عربی رو با فارسی replace کردم.
public string ConvertCharPersianToArabic(string Input) { if (Input != null) { char he1 = Convert.ToChar(1607); char he2 = Convert.ToChar(1728); Input = Input.Replace(he1, he2); return Input; } else { return ""; } } در هر صورت از نظر من این یه جواب ایده آل نیست و بنابراین فعلاً ترجیح می دم فیلدهای منو رو با این که تعدادشون زیاده خودم پشت سر هم در جدول درج کنم و بر اساس فیلد ID مرتب سازی رو انجام بدم. ولی خوب در جاهایی که درج از طریق کارفرما صورت می گیره این جوابگو نیست و فعلاً ظاهراً جز همون راهی که نوشتم چاره ای نیست.

mostafa_v65
پنج شنبه 02 فروردین 1397, 17:13 عصر
سلام
در صورتیکه collation دیتابیس رو به فارسی مثلا Persian_100_CS_AS تغییر بدید تمام مشکلات حل خواهد شد
این امکان فکر میکنم از Sql server 2008 به بالا وجود داشته باشه