PDA

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



pardisannet
چهارشنبه 13 اردیبهشت 1391, 19:21 عصر
باز هم بحث فارسی نویسی و مشکلات آن، کمک کنید


دوستان من برنامه ای با سی شارپ نوشتم و نزدیک به 4000 رکورد ثبت کردم . حالا موقع سرچ در مثلا کمبو باکس حروف "ی" و "ک" و غیره به دو صورت در بانک ذخیره شده. یک نوع حرف "ی" و "ک" فارسی و بدون دو نقطه در زیر حرف "ی" و بدون حمزه در روی حرف ک. و در نوع دوم حرف "ی" و "ک" عربی.

حال نمیدونم چه کار باید بکنم. مهمترین چیزی که از دوستان میخوام روشی است برای تعریف تک تک حروف مخصوصا این دو حرف در برنامه خودم که هر جا و هر سیستمی که برنامه رو نصب کردم این مشکل تکرار نشه. یعنی کد اسکی حروف رو اول توی برنامه تعریف کنم. مثل وب نویسها که تو برنامشون میگن "لطفا صفحه کلید را در حالت EN" قرار دهید.

و در ادامه چه کار کنم واسه این بانک 4000 رکوردی ؟ جالب اینجاست که وقتی با یک سیستم که kbdfa.dll اون بر اساس حرف "ی" و "ک" فارسی است کار میکنم و میخوام با دستورات اس کیو ال بانک را آپدیت کنم هیچ اتفاقی نمیفته. ظاهرا مربوط به کد اسکی حروف میشه. دوستان انصافا کمک کنید دارم بیچاره میشم.

در ضمن از این هم استفاده میکنم :
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fa-IR");
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture;

MMSHFE
چهارشنبه 13 اردیبهشت 1391, 19:29 عصر
با سلام، دوست گرامی باید این سؤال رو در تالار ASP.NET مطرح کنید. با اجازه شما من این تاپیک رو به اون بخش منتقل میکنم چون اونجا بهتر جواب میگیرین. موفق باشید.

ehsan2007
چهارشنبه 13 اردیبهشت 1391, 19:51 عصر
سلام از این کوئری در sql استفاده کن


SET

@DarsName = REPLACE(@DarsName,NCHAR(1740),NCHAR(1610))

SET

@DarsName = REPLACE(@DarsName,NCHAR(1705),NCHAR(1603))

d_derakhshani
چهارشنبه 13 اردیبهشت 1391, 20:30 عصر
استفاده از دستور از sql نمی تونه همیشه مفید واقع بشه چون ممکنه برای مثال ممکنه از EF استفاده بشه. یا اصلا دیتابیس sql نباشه. بهتره که یک تابع بنویسید به نام AdjustInput و در اون متد های Replace رو بنویسید.
بعد هر موقع می خواهید اطلاعات رو به بانک بفرستید یا بی شی مورد نظر در EF بدید بر فراخوانی این تابع و دادن مقدار مربوطه ه انجام بدید.

hamid_shrk
چهارشنبه 13 اردیبهشت 1391, 20:52 عصر
پیشنهاد میکنم کامپوننت رو از این تاپیک دانلود کنید:
http://barnamenevis.org/showthread.php?321852-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE%D9%87%D8%A7-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AD%D8%B1%D9%88%D9%81-%DB%8C-%D9%88-%DA%A9-%D8%B9%D8%B1%D8%A8%DB%8C-%D8%A8%D9%87-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-Persia-.NET-3.0&highlight=%D8%AA%D8%A7%D8%A8%D8%B9+%D8%AA%D8%BA%DB %8C%DB%8C%D8%B1+%D8%AD%D8%B1%D9%88%D9%81+%D8%B9%D8 %B1%D8%A8%DB%8C

و بعد از وارد کردن متن مثلا برای سرچ و فارسی کردن متن از کد زیر استفاده کنید :


string dd = Persia.PersianWord.ToPersianString("جمله عربی");

mahmood_4246
چهارشنبه 13 اردیبهشت 1391, 23:08 عصر
یه سری راه ها هست توی اینترنت یا تو همین تالار جسجو کنید زیاده
یکی از بهترین راه ها استفاده از HttpHandler هست .. کدش دمه دست نیست..شماگیر نیوردی بگو برات بفرستم

bahareh1368
پنج شنبه 14 اردیبهشت 1391, 08:55 صبح
من این کار رو با HttpModule انجام دادم اینم کدش :


public class MyTestHttpModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{ }
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}
#endregion

private void context_BeginRequest(object sender, EventArgs e)
{
var application = sender as HttpApplication;
if (application.Request.RawUrl.Contains(".aspx"))
{
application.Response.Filter = new PersianCharsFilter(application.Response.Filter);
} } }


کلاس زیر برای تعریف و تشخیص و تبدیل حروف عربی به فارسی استفاده میشه :


namespace MyIIS7_Demos
{
#region Stream filter
class PersianCharsFilter : Stream
{ private Stream _stream;
public PersianCharsFilter(Stream stream)
{ _stream = stream; }

#region Properites
public override bool CanRead
{ get { return true; } }
public override bool CanSeek
{ get { return true; } }
public override bool CanWrite
{ get { return true; } }
public override void Flush()
{ _stream.Flush(); }
public override long Length
{ get { return 0; } }
private long _position;
public override long Position
{ get { return _position; }
set { _position = value; }
}
#endregion

#region Methods
public override int Read(byte[] buffer, int offset, int count)
{ return _stream.Read(buffer, offset, count); }
public override long Seek(long offset, SeekOrigin origin)
{ return _stream.Seek(offset, origin); }
public override void SetLength(long value)
{ _stream.SetLength(value); }
public override void Close()
{ _stream.Close(); }
public override void Write(byte[] buffer, int offset, int count)
{ byte[] data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
string html = System.Text.Encoding.UTF8.GetString(buffer);
html = html.Replace("ي", "ی");
html = html.Replace("ك", "ک");
byte[] outdata = System.Text.Encoding.UTF8.GetBytes(html);
_stream.Write(outdata, 0, outdata.GetLength(0)); }
#endregion
}
#endregion
}


این تنظیمات هم در وب کانفیگ باید انجام بدی :


<configuration>
<system.web>
<httpModules>
<addname="MyTestHttpModule"type="MyIIS7_Demos.MyTestHttpModule"/>
</httpModules>
</system.web>
</configuration>


همانطور که می بینید در این برنامه ماژولی با نام MyTestHttpModule نوشته شده که در متد Init آن آمده رویداد context_BeginRequest را که خودمان نوشته ایم به انتهای رویداد BeginRequest شی Application که در Global.asax قرار دارد اضافه کرده است. سپس در این رویداد اضافه شده توسط خودمان ، چک کرده است که اگر URL در بردارنده aspx است به این معنا که صفحه درخواستی اگر صفحه وب است برای شی Response فیلتر تعریف نموده است. شی فیلتر از جنس stream می باشد بنابراین باید متغیری از این جنس به آن نسبت دهیم. برای این کار کلاس PersianCharsFilter را تعریف نموده و برای اینکه کلیه خواص Stream را دارا باشد از stream ذث ارث رفته است. این کار باعث می گردد که کد کلیه پراپرتی ها و متد های این کلاس که می بایست پیاده سازی گردند نوشته شود و ما می بایست درون آنها را پیاده سازی نماییم. کلیه پراپرتی ها و متد کار خاصی انجام نمی دهند به جز متد Write که باعث نوشتن متن داخل Stream در خروجی (در برنامه ما در Response خروجی نوشته می شود) می شود را با کد نوشته شده حروف ي با دونقطه در زیر آن ، و حرف ك که دارای همزه می باشد به حرف ی بدون نقطه و ک بدون حمزه تبدیل و تصحیح گردیده است.
با این ماژول در تمامی صفحات aspx همه صفحات پس از آن که نسخه HTML آن در شی Response ساخته شد یعنی فرضا در صفحه ای که Data Grid View داریم و اطلاعات آن از بانک با حروف مشکل دار پر شده و کامل شد ، قبل از ارسال به کاربر در چرخه Http Pipeline حروف فارسی اصلاح شده و سپس به کاربر ارسال می گردد.
برای تست این ماژول صفحه ای به نام ArabicCharsTest.aspx داریم که دارای یک خط نوشته فارسی بصورت « يك ي بود ی فارسی » است. با اجرای برنامه و نمایش صفحه نوشته مذکور بصورت « یک ی بود ی فارسی» در می آید.



<%@ Page Language="C#‎‎" AutoEventWireup="true" CodeBehind="ArabicCharsTest.aspx.cs" Inherits="MyIIS7_Demos.ArabicCharsTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="يك ي بود ی فارسی."></asp:Label>

</div>
</form>
</body>
</html>

Saman Hashemi
پنج شنبه 14 اردیبهشت 1391, 10:10 صبح
شاید این لینک (http://samanhashemi.ir/?p=83)کمکتون کنه...!

pardisannet
پنج شنبه 14 اردیبهشت 1391, 20:05 عصر
دوستان عزیز من واقعا ازتون متشکرم . انشاءالله موفق و موید و پایدار باشید.

pardisannet
پنج شنبه 14 اردیبهشت 1391, 20:07 عصر
دوست عزیز سلام . میتونم خواهش کنم مثالی بزنید. در ضمن منظورتون رو از EF بیان کنید، چون من واقعا نمیدونم.

pardisannet
پنج شنبه 14 اردیبهشت 1391, 20:08 عصر
من این کار رو با HttpModule انجام دادم اینم کدش :


public class MyTestHttpModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{ }
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}
#endregion

private void context_BeginRequest(object sender, EventArgs e)
{
var application = sender as HttpApplication;
if (application.Request.RawUrl.Contains(".aspx"))
{
application.Response.Filter = new PersianCharsFilter(application.Response.Filter);
} } }


کلاس زیر برای تعریف و تشخیص و تبدیل حروف عربی به فارسی استفاده میشه :


namespace MyIIS7_Demos
{
#region Stream filter
class PersianCharsFilter : Stream
{ private Stream _stream;
public PersianCharsFilter(Stream stream)
{ _stream = stream; }

#region Properites
public override bool CanRead
{ get { return true; } }
public override bool CanSeek
{ get { return true; } }
public override bool CanWrite
{ get { return true; } }
public override void Flush()
{ _stream.Flush(); }
public override long Length
{ get { return 0; } }
private long _position;
public override long Position
{ get { return _position; }
set { _position = value; }
}
#endregion

#region Methods
public override int Read(byte[] buffer, int offset, int count)
{ return _stream.Read(buffer, offset, count); }
public override long Seek(long offset, SeekOrigin origin)
{ return _stream.Seek(offset, origin); }
public override void SetLength(long value)
{ _stream.SetLength(value); }
public override void Close()
{ _stream.Close(); }
public override void Write(byte[] buffer, int offset, int count)
{ byte[] data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
string html = System.Text.Encoding.UTF8.GetString(buffer);
html = html.Replace("ي", "ی");
html = html.Replace("ك", "ک");
byte[] outdata = System.Text.Encoding.UTF8.GetBytes(html);
_stream.Write(outdata, 0, outdata.GetLength(0)); }
#endregion
}
#endregion
}


این تنظیمات هم در وب کانفیگ باید انجام بدی :


<configuration>
<system.web>
<httpModules>
<addname="MyTestHttpModule"type="MyIIS7_Demos.MyTestHttpModule"/>
</httpModules>
</system.web>
</configuration>


همانطور که می بینید در این برنامه ماژولی با نام MyTestHttpModule نوشته شده که در متد Init آن آمده رویداد context_BeginRequest را که خودمان نوشته ایم به انتهای رویداد BeginRequest شی Application که در Global.asax قرار دارد اضافه کرده است. سپس در این رویداد اضافه شده توسط خودمان ، چک کرده است که اگر URL در بردارنده aspx است به این معنا که صفحه درخواستی اگر صفحه وب است برای شی Response فیلتر تعریف نموده است. شی فیلتر از جنس stream می باشد بنابراین باید متغیری از این جنس به آن نسبت دهیم. برای این کار کلاس PersianCharsFilter را تعریف نموده و برای اینکه کلیه خواص Stream را دارا باشد از stream ذث ارث رفته است. این کار باعث می گردد که کد کلیه پراپرتی ها و متد های این کلاس که می بایست پیاده سازی گردند نوشته شود و ما می بایست درون آنها را پیاده سازی نماییم. کلیه پراپرتی ها و متد کار خاصی انجام نمی دهند به جز متد Write که باعث نوشتن متن داخل Stream در خروجی (در برنامه ما در Response خروجی نوشته می شود) می شود را با کد نوشته شده حروف ي با دونقطه در زیر آن ، و حرف ك که دارای همزه می باشد به حرف ی بدون نقطه و ک بدون حمزه تبدیل و تصحیح گردیده است.
با این ماژول در تمامی صفحات aspx همه صفحات پس از آن که نسخه HTML آن در شی Response ساخته شد یعنی فرضا در صفحه ای که Data Grid View داریم و اطلاعات آن از بانک با حروف مشکل دار پر شده و کامل شد ، قبل از ارسال به کاربر در چرخه Http Pipeline حروف فارسی اصلاح شده و سپس به کاربر ارسال می گردد.
برای تست این ماژول صفحه ای به نام ArabicCharsTest.aspx داریم که دارای یک خط نوشته فارسی بصورت « يك ي بود ی فارسی » است. با اجرای برنامه و نمایش صفحه نوشته مذکور بصورت « یک ی بود ی فارسی» در می آید.



<%@ Page Language="C#‎‎" AutoEventWireup="true" CodeBehind="ArabicCharsTest.aspx.cs" Inherits="MyIIS7_Demos.ArabicCharsTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="يك ي بود ی فارسی."></asp:Label>

</div>
</form>
</body>
</html>









دوست عزیز واقعا محبت کردید. ازتون متشکرم . انشاءالله موفق و موید و پایدار باشید