PDA

View Full Version : رفع مشکل فارسی نویسی در ASP و ASP.NET



Vahid_Nasiri
یک شنبه 09 شهریور 1382, 10:28 صبح
با سلام

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

با تشکر

Vahid_Nasiri
یک شنبه 09 شهریور 1382, 10:35 صبح
من یک سایت بصورت آزمایشی طراحی کرده ام وآنرا در یک host آزاد خارجی قرار داده ام . مشکل اینجاست که وقتی وارد سایت میشوم فونت فارسی نمایش داده نمیشود در حالیکه نسخه روی کامپیوتر خودم بدرستی کار میکند . آیا نیازی به نصب فونت فارسی در کامپیوتر host هست یا مشکل چیز دیگریست.
با utf-8 و فونت tahoma نباید مشکلی داشته باشِد.

---------------------

در مورد asp باید خود فایل نیز فرمتش utf-8‌ باشد. بااستفاده از notepad می تونید اون رو save as‌ با encoding مخصوص کنید.

--------------------
در هنگام ذخیره سازی متن در اس کیو ال سرور :

بصورت ؟؟؟؟؟ ذخیره میشن .

دلیل : باید از یک N قبل از عبارت insert و یا آپدیت استفاده کنید. نوع فیلدها هم باید با n شروع شود مانند ntext و غیره. n به معنای national است.

--------------------

Vahid_Nasiri
یک شنبه 09 شهریور 1382, 10:41 صبح
چه جوری می توانم کاری کنم که وقتی page من اجرا شد به صورت پیش فرز صفحه نمایش از راست به چپ نمایش دهد.

Dir صفحه را در صفحه Properties بر روی rtl قرار دهید

--------------------------


توی صفحاتی که با asp.net طراحی کردم ، هر موقع که با Back بین صفحاتی که قبلا رفتم بر می گردم ، متنهای فارسی رو با کاراکترهای نا مفهووم نمایش میده . اما وقتی با لینکها شوون میرم ، متنهای فارسی رو هم درست نشوون میده

برای فارسی نشان دادن در محیط ASP.NET با توجه به اینکه در VS.NET ساپورت کامل یونیکد وجود دارد باید مراحل زیر حتما انجام شود:
1- در صفحه ی خواص هر فرم باید charset را به unicode ست کنید
2- هر صفحه ی aspx را باید از منوی فایل با استفاده از گزینه ی save as دوباره به صورت یونیکد with sig. ثبت کنید. اگر در این حالت دقت کنید دکمه ی save as یک علامت مثلث رویش است. روی آن کلیک کنید تا یک منوی کوچک باز شود. حالا در این منو save with encoding وجود دارد.
3- تمام code behinde ها یعنی سورس صفحات مانند cs.* را باید دوباره save as کرده و مطابق روش 2 آنرا save with encoding کنید. حالا گزینه ی utf-8 را که انتخاب کنید مشکل این یکی هم حل می شود.

این سه مرحله باید روی *هر* صفحه انجام شود.

--------------------------

Vahid_Nasiri
یک شنبه 09 شهریور 1382, 10:42 صبح
در ASP :


<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnStart
session.codepage=65001 'UTF-8 Code Page
END SUB
</SCRIPT>

Vahid_Nasiri
یک شنبه 09 شهریور 1382, 10:46 صبح
در صفحات HTML و در صفحات ASP این مورد فراموش نشود :


<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

-------------------------------------


شما اگر از دکمه های back و forward استفاده کنید در IE دوباره صفحه ی شما به هم می ریزد. فکر می کنید چرا؟

دلیل :


<globalization requestEncoding="windows-1252" responseEncoding="windows-1252" fileEncoding="windows-1252" culture="en-US" uiCulture="en-US" />

در وب کانفیگ روی هاست شما 1252 را دقیقا به utf-8 و نه چیز دیگری تبدیل کنید این مشکل هم حل می شود

-------------------------------------

Vahid_Nasiri
یک شنبه 09 شهریور 1382, 10:55 صبح
مشکل اینست که بنده با فرمت utf-8 اطلاعات را به بانک اکسس می‌ریزم ، اما وقتی می‌خواهم آن را در ویندوز مشاهده کنم نوشته‌ها به هم ریخته است ولی اگر از windows-1256 استفاده کنم نه!

من در sqlserver به شکل زیر حل کردم در اکسس هم شاید بشه :
-1 فیلدها رو از نوع nvarchar تعریف کن
2- قبل از مقدار فیلدها حرف N رو بذار

کد meta tage .... utf-8 رو قبل از انجام save قرار بده - حله
------------------------------------

- <meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
برای کار شما مناسب نیست. همان utf-8 خوب است
- به نظر می رسد از SQL server داری استفاده می کنی؟ اگر اینطور است باید در تعریف جدوال SQL سرور این مورد را COLLATE Arabic_CI_AS NOT NULL بجای لاتینی که الان هست اضافه کنی و بهتر است بگویم باید اون را به این صورت Patch کنی !!
اگر دقت کنی الان در اسکریپتی که مربوط به جداول SQL سرور است تعاریف به صورت زیر است
COLLATE SQL_Latin1_General_CP1256_CI_AS NOT NULL
این مورد برای انگلیسی نویسی خوب است ولی نه برای فارسی عربی نویسی

- آیا فایلهای معمولی را با فرمت UTF-8‌دوباره Save as کردی یا یادت رفته ؟
این موضوع خیلی مهم است. تا اینکار را نکنی همه چیز ANSI در صفحات ثبت می شود و نه یونیکد. با استفاده از نوت پد ویندوزهای 2000 به بالا می تونی این Save as را انجام بدی
------------------------------------

اسکریپت فارسی نویسی


script>
function submitenter(myfield,e)
{
var key;
if (window.event)
key = window.event.keyCode;
else if (e)
key = e.which;
if (key>31)
if (key<128)
{
if (window.event)
window.event.keyCode=' !"#$%،گ)(×+و-./0123456789:ک,=.؟@ِذ}ىُىلآ÷ـ،/’د×؛َءٍف‘{ًْإ~جژچ^_پشذزیثب لاهتنمئدخحضقسفعرصطغظ<|>ّ'.charCodeAt(key-32);
else if (e)
e.which=' !"#$%،گ)(×+و-./0123456789:ک,=.؟@ِذ}ىُىلآ÷ـ،/’د×؛َءٍف‘{ًْإ~جژچ^_پشذزیثب لاهتنمئدخحضقسفعرصطغظ<|>ّ'.charCodeAt(key-32);

}
return true;
}

</script>

<input type="text" onkeypress="return submitenter(this,event)" name="Name" >
-------------------------------

تاریخ شمشی در ASP


<%@Language=VBScript%>
<META http-equiv=CONTENT-TYPE content="text/html; charset=utf-8">
<%
D = Array (20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21)
P = Array (11, 12, 10, 12, 11, 11, 10, 10, 10, 9, 10, 10)
W = Array ("یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه")
Mon = Array ("فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند")
Dm = Day(Date)
Mm = Month(Date)
Ym = Year(Date)
U = 0
Rp = 0
If (Ym Mod 4) = 0 Then U = 1
If ((Ym Mod 100) = 0 AND (Ym Mod 400) <> 0) Then U = 0
Ys = Ym - 622
X = Ys - 22
X = X Mod 33
If ((X Mod 4) = 0 AND X <> 32) Then Rp = 1
I = Not(Rp-2) + NOT(U - 2) * 2
X = 0
If (I = 0 AND Mm = 3) Then X = 1
If I = 0 Then I = 3
Ms = (9 + Mm) Mod 13
If Ms < 10 Then Ms = Ms + 1
D1 = D(Mm - 1)
If (I = 1 AND Mm > 2) Then D1 = D1 - 1
If (I = 2 AND Mm < 3) then D1 = D1 - 1
P1 = P(Mm - 1)
If (I = 1 AND Mm > 2) Then P1 = P1 + 1
If (I = 2 AND Mm < 4) Then P1 = P1 + 1
If (Dm > 0 AND Dm <= D1) Then
Ds = P1 + Dm + X - 1
X = 1
Else
Ds = Dm - D1
Ms = Ms + 1
If Ms = 13 Then Ms = 1
X = 2
End If
If ((Mm = 3 AND X = 2) OR Mm > 3) Then Ys = Ys + 1
DateShamsi = W(WeekDay(Date) - 1) & "&" & Ds & "&" & Mon(Ms - 1) & "&" & Ys
%>
<%= DateShamsi %>/
-------------------------------

Vahid_Nasiri
یک شنبه 09 شهریور 1382, 11:05 صبح
تاریخ شمسی در محیط دات نت


using System;


namespace Zarin
{
/// <summary>
/// clsPesianDate.
/// Converted to VC# by : Vahid_Nasiri@Yahoo.Com <mailto:Vahid_Nasiri@Yahoo.Com>
/// </summary>
public class clsPersianDate
{


public clsPersianDate()
{
//
// TODO: Add constructor logic here (chi! bih!)
//
}


/// <summary>
/// GetShamsiDate.
/// Its name is so clear!
/// </summary>
public string GetSystemShamsiDate()
{

int Year = System.DateTime.Now.Year;
int Month = System.DateTime.Now.Month;
int Day = System.DateTime.Now.Day ;
return GetShamsiDate(Year, Month, Day);

}


/// <summary>
/// GetShamsiDate.
/// Converts the specified date to shamsi.
/// </summary>
public string GetShamsiDate(int Year,int Month,int Day)
{
int[] A ={0,10, 11, 9, 11, 10, 10, 9, 9, 9, 8, 9, 9};
int[] B ={0,30, 30, 29, 31, 31, 31, 31, 31, 31, 30, 30, 30};

int YY;
int MM;
int DD;
string CHm,CHd ;

// Get current Date values
YY = Year - 621;
if ((Year % 4 == 0) && (Month == 3) && (Day < 21))
{
A[3]++;
B[3]++;
}
MM = Month + 9;
DD = Day + A[Month];
if (DD > B[Month])
{
DD -= B[Month];
MM++;
}
if (MM > 12)
MM -= 12;

if (MM == 10 && DD > 10)
YY--;

if (MM == 11 || MM == 12)
YY--;

if (MM<10)
CHm = "0" + MM.ToString() ;
else
CHm = MM.ToString() ;

if (DD<10)
CHd = "0" + DD.ToString() ;
else
CHd = DD.ToString() ;

return YY.ToString() + '/' + CHm + '/' + CHd;
}

public string systemDayOfWeek()
{
string res="";

switch( System.DateTime.Now.DayOfWeek.ToString() )
{
case "Saturday" :
res = "شنبه";
break;

case "Sunday" :
res = "یک شنبه" ;
break;

case "Monday":
res = "دوشنبه";
break;

case "Tuesday":
res = "سه شنبه";
break;

case "Wednesday":
res = "چهار شنبه";
break;

case "Thursday":
res = "پنج شنبه";
break;

case "Friday":
res = "جمعه" ;
break;
}

return res ;

}

public string systemShamsiDatTime()
{

return
GetSystemShamsiDate() + " اکنون " +"\n"+
System.DateTime.Now.ToLongTimeString() +"\n"+
System.DateTime.Now.ToLongDateString() + " " +"\n"+
System.DateTime.Now.DayOfWeek + " "+
systemDayOfWeek() ;
}

}
}

نام فصای نام این کلاس همانطور که مشاهده می فرمایید Zarin است. زرین اینجا نام پروژه است. ( پس بهتر است آنرا مطابق نام کلی پروژه ویرایش کنید )
برای استفاده کافی است یک متغیر از کلاس ایجاد کنید و سپس متد را به صورت زیر فراخوانی کنید :


clsPersianDate m_d = new clsPersianDate(); lblDate.Text = m_d.GetSystemShamsiDate();


در مثال فوق من یک لیبل روی فرم گذاشته ام . و سپس با استفاده از متغیر تعریف شده از کلاس به تابع مورد نظر دسترسی پیدا کرده ام.

در ضمن کلاس فوق امتحان خودش را پس داده است.

Vahid_Nasiri
یک شنبه 09 شهریور 1382, 11:07 صبح
یک اسکریپت کامل و بدون نقص برای فارسی نویسی مستقل از سیستم عامل در وب :


<!---------------------------------

var lang = 1; // 1: Farsi, 0: English

var keys = new Array(1711,0,0,0,0,1608,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,
1603,1572,0,1548,1567,0,1616,
1571,8250,0,1615,0,0,1570,
1577,0,0,0,1569,1573,0,0,1614,1612,1613,0,0,8249,1 611,
171,0,187,1580,1688,1670,0,1600,
1662,1588,1584,1586,1610,1579,1576,
1604,1575,1607,1578,1606,1605,1574,
1583,1582,1581,1590,1602,1587,1601,1593,1585,1589, 1591,1594,1592);


function FKeyDown (){
var key = window.event.keyCode;
if (key == 145){
if (lang == 0)
{
lang = 1;
return true;
}
else
{
lang = 0;
return true;
}
}
}

function keyConv(){

if (lang == 1)
{
if((event.keyCode > 38) && (event.keyCode < 123)){
event.keyCode = (keys[event.keyCode - 39])? (keys[event.keyCode - 39]): event.keyCode;
}
}
}


function strvalidate_fa(str){
var i, chr;
for(i = 0 ; i < str.length ; i++){
chr = str.charCodeAt(i);
if(!((chr == 32) || (chr >= 1569 && chr <= 1594) || (chr >= 1601 && chr <= 1610) || (chr == 1662) || (chr == 1670) || (chr == 1688) || (chr == 1711))) return false;
}
return true;
}

//<TEXTAREA class=forms onkeypress="keyConv()" onkeydown="FKeyDown()" dir=rtl name=S1 rows=15 cols=84> </TEXTAREA>

//-->

Mohammad_Mnt
یک شنبه 09 شهریور 1382, 18:53 عصر
:تشویق:

M-Gheibi
دوشنبه 10 شهریور 1382, 13:04 عصر
عالیه :تشویق: :P :دلار:

عزیز
یک شنبه 01 بهمن 1385, 10:44 صبح
مرسی.عالی بود.

daneshpazho
یک شنبه 01 بهمن 1385, 10:54 صبح
واسه تبدیل تاریخ یه راه خیلی ساده تر هم هست
http://kourdeh.somee.com/cdate.aspx
می تونین یه سربزنین اگه راهش واستون مهمه بگین تا واستون بنویسم .
البته فقط با C# چون وی بی بلد نیستم

rtech
یک شنبه 01 بهمن 1385, 12:02 عصر
واسه تبدیل تاریخ یه راه خیلی ساده تر هم هست
http://kourdeh.somee.com/cdate.aspx
می تونین یه سربزنین اگه راهش واستون مهمه بگین تا واستون بنویسم .
البته فقط با C# چون وی بی بلد نیستم

کسی تونسته تقویم DNN رو فارسی کنه ؟

daneshpazho
یک شنبه 01 بهمن 1385, 16:37 عصر
یه سر به
SYSTEM.GLOBALIZATION
بزن
هر تقویمی که بخواهی توش هست.......................

rtech
یک شنبه 01 بهمن 1385, 20:04 عصر
اما تقویم DNN جاوا اسکریپته !!!