PDA

View Full Version : مشکل کیبرد در ثبت در دیتابیس



cnmeysam
دوشنبه 20 آذر 1396, 10:21 صبح
سلام
یه مشکلی برام پیش اومده تو برنامه ای که نوشتم کاربر وقتی توی دیتابیس چیزی رو ثبت میکنه توی یک سیستم دیگه نمیتونه جستجو کنه
بعد از کلی فهمیدم که کیبردش عربی هست و مثلا ی رو ي ثبت میکنه
و توی سیستم دیگه که کیبردش فارسی هست دیگه نمیشه جستجو کرد مقادیری که ثبت شده
دیتابیس utf8_persian_ci هستش تو برنامه هم از utf8 توی کانکشن استفاده کردم
راه حلی دارین که بشه این مشکل رو حل کرد؟

vahid-p
دوشنبه 20 آذر 1396, 10:50 صبح
برای چنین مسائلی معمولا راه حل اینه همه کاراکترهای معادل اما متفاوت رو به یک کاراکتر تبدیل کنید هم تو دیتابیس هم تو کوئری که از فرد گرفته میشه.
مثلا تفاوت هایی که وجود داره اعداد است. اعداد استاندارد انگلیسی هست، اعداد فارسی و اعداد عربی. که بهتره همشون به یه چیز تبدیل بشن.
در مورد حروف هم حروفی مثل "ی" و "ي" و "ک" و "ك" رو باید به یک کاراکتر تبدیل کنید. هر چند ممکنه بعضیا "ه" و "ة" رو هم جا به جا بنویسن ولی احتمالش خیلی کمه و این دو تا دو حرف جداگونه هستند. ولی اون دو مثال قبلی رسم الخط متفاوتی هستند.

cnmeysam
دوشنبه 20 آذر 1396, 10:56 صبح
مشکل اینجاست که فقط حرف مثلا س رو هم با کیبرد عربی مینویسه باز اون مشکل پابرجاست هر حرفی با اون سیستم مینویسه توی این یکیا سرچ نمیشه
چون کلی دیتا هم باهاش ثبت کرده نمیشه کل دیتابیس رو پاک کرد که چاره کار چیه الان؟

cnmeysam
دوشنبه 20 آذر 1396, 11:24 صبح
البته این کد رو پیدا کردم






update tbl_primarysubstance set primarysubstances=REPLACE(primarysubstances,'ي',N 'ی')
update tbl_primarysubstance set primarysubstances=REPLACE(primarysubstances,'ك',N 'ک')



ولی اگه بخوام تمام تیبل ها ور کلوم هارو یکی یکی اینجوری آپدیت کنم پوستم کنده میشه که:لبخند:

vahid-p
دوشنبه 20 آذر 1396, 12:37 عصر
دستی یا کد باید بنویسید و کل دیتابیس رو آپدیت کنید. راه دیگه ای به ذهنم نمیرسه
فقط بهتره برید تمام حروف رو با اون کیبورد بنویسید و کد هر کدوم رو بگیرید و با یک کیبورد فارسی رو همین کار رو انجام بدید تا ببینید کدوما کدشون متفاوته. حرف "س" متفاوت نیست، ولی خب باز چک کنید شاید مشکل یه جای دیگست. از جدول این سایت هم میتونید استفاده کنید: https://unicode-table.com/en/

برای کدهای عربی (که شامل عربی، فارسی، کردی و... میشه): https://unicode-table.com/en/blocks/arabic/
برای کدهای عربی تکمیلی (که بعید میدونم به کارتون بیاد): https://unicode-table.com/en/blocks/arabic-supplement/
برای کدهای عربی باز توسعه داده شده (که بازم به کار نمیاد): https://unicode-table.com/en/blocks/arabic-extended-a/

cnmeysam
دوشنبه 20 آذر 1396, 12:47 عصر
ممنون از وقتی که گذاشتی یه سوال دیگه هم دارم متوجه نشدم چطوری باید کاری کنم کاربر اگه توی تکست باکس ك نوشت خودش درست بشه و تبدیل به ک بشه!
البته این کد رو پیدا کردم ولی نفهمیدم چطوری ازش استفاده کنم

public String SafeFarsiStr(String input)
{
return input.replace("ي", "ی").replace("ك", "ک");
}

vahid-p
دوشنبه 20 آذر 1396, 14:04 عصر
اینکه بخوای نوشته تو textbox درست بشه ممکنه کارت رو سخت کنه و هندل کردنش معمولا یه سری مشکلات جزئی درست میکنه (میشه مثلا رو keyrelease یک listener بذاری و هی رشته قبلی رو حذف و رشته تصحیح شده تو textbox جایگزین کنی ولی اینکار رو توصیه نمیکنم). بذار هر چی خواست بنویسه، وقتی میخوای تو دیتابیس جستجو کنی با این تابع رشته تصحیح شده رو به جای رشته اصلی در دیتابیس جستجو کن.

cnmeysam
دوشنبه 20 آذر 1396, 14:08 عصر
مثل همین دستور

update tbl_primarysubstance set primarysubstances=REPLACE(primarysubstances,'ي',N 'ی')
update tbl_primarysubstance set primarysubstances=REPLACE(primarysubstances,'ك',N 'ک')

دستوری توی جاوا نیست که بگم وقتی jtext روش KeyReleased میشه اگه "ي" وارد شده بود تبدیل بشه به "ی" و اگه "ك" وارد شده بود تبدیل بشه به "ک" البته بدون اینکه متن نوشته شده خراب بشه فقط این 2 تا حرف تغییر پیدا کنن؟

cnmeysam
دوشنبه 20 آذر 1396, 14:13 عصر
اینکه بخوای نوشته تو textbox درست بشه ممکنه کارت رو سخت کنه و هندل کردنش معمولا یه سری مشکلات جزئی درست میکنه (میشه مثلا رو keyrelease یک listener بذاری و هی رشته قبلی رو حذف و رشته تصحیح شده تو textbox جایگزین کنی ولی اینکار رو توصیه نمیکنم). بذار هر چی خواست بنویسه، وقتی میخوای تو دیتابیس جستجو کنی با این تابع رشته تصحیح شده رو به جای رشته اصلی در دیتابیس جستجو کن.
آخه جدا از اینکه نمیدونم کلا باید چیکار کنم اینجوری باید هم توی ثبت هم توی ویرایش هم توی جستجو بیام اون حروف رو تبدیل کنم کار 3 برابر بیشتر نمیشه؟

cnmeysam
دوشنبه 20 آذر 1396, 15:50 عصر
این هم شاید بشه استفاده کرد


private void txtsearchKeyReleased(java.awt.event.KeyEvent evt) {
// TODO add your handling code here:
String a = txtsearch.getText();
String b = a.replace("ي", "ی");
txtsearch.setText(b);

String c = txtsearch.getText();
String d = c.replace("ك", "ک");
txtsearch.setText(d);
}