# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > ASP.NET Web Forms >  رفع مشکل فارسی نویسی در ASP و ASP.NET

## Vahid_Nasiri

با سلام

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

با تشکر

----------


## Vahid_Nasiri

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


با utf-8 و فونت tahoma نباید مشکلی داشته باشِد.

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

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

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



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


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

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

----------


## Vahid_Nasiri

> چه جوری می توانم کاری کنم که وقتی 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

در ASP :

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

----------


## Vahid_Nasiri

در صفحات HTML و در صفحات ASP این مورد فراموش نشود :

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

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




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


دلیل : 

&lt;globalization requestEncoding="windows-1252" responseEncoding="windows-1252" fileEncoding="windows-1252" culture="en-US" uiCulture="en-US" /> 	

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

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

----------


## Vahid_Nasiri

> مشکل اینست که بنده با فرمت utf-8 اطلاعات را به بانک اکسس می‌ریزم ، اما وقتی می‌خواهم آن را در ویندوز مشاهده کنم نوشته‌ها به هم ریخته است ولی اگر از windows-1256 استفاده کنم نه!


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

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

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

&#125; 
return true; 
&#125; 

&lt;/script> 

&lt;input type="text" onkeypress="return submitenter&#40;this,event&#41;" name="Name" > 
-------------------------------

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

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

----------


## Vahid_Nasiri

تاریخ شمسی در محیط دات نت 

﻿using System; 


namespace Zarin 
&#123; 
/// &lt;summary> 
/// clsPesianDate. 
/// Converted to VC#‎ by &#58; Vahid_Nasiri@Yahoo.Com &lt;mailto&#58;Vahid_Nasiri@Yahoo.Com> 
/// &lt;/summary> 
public class clsPersianDate 
&#123; 


public clsPersianDate&#40;&#41; 
&#123; 
// 
// TODO&#58; Add constructor logic here &#40;chi! bih!&#41; 
// 
&#125; 


/// &lt;summary> 
/// GetShamsiDate. 
/// Its name is so clear! 
/// &lt;/summary> 
public string GetSystemShamsiDate&#40;&#41; 
&#123; 

int Year = System.DateTime.Now.Year; 
int Month = System.DateTime.Now.Month; 
int Day = System.DateTime.Now.Day ; 
return GetShamsiDate&#40;Year, Month, Day&#41;; 

&#125; 


/// &lt;summary> 
/// GetShamsiDate. 
/// Converts the specified date to shamsi. 
/// &lt;/summary> 
public string GetShamsiDate&#40;int Year,int Month,int Day&#41; 
&#123; 
int&#91;&#93; A =&#123;0,10, 11, 9, 11, 10, 10, 9, 9, 9, 8, 9, 9&#125;; 
int&#91;&#93; B =&#123;0,30, 30, 29, 31, 31, 31, 31, 31, 31, 30, 30, 30&#125;; 

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

// Get current Date values 
YY = Year - 621; 
if &#40;&#40;Year % 4 == 0&#41; && &#40;Month == 3&#41; && &#40;Day &lt; 21&#41;&#41; 
&#123; 
A&#91;3&#93;++; 
B&#91;3&#93;++; 
&#125; 
MM = Month + 9; 
DD = Day + A&#91;Month&#93;; 
if &#40;DD > B&#91;Month&#93;&#41; 
&#123; 
DD -= B&#91;Month&#93;; 
MM++; 
&#125; 
if &#40;MM > 12&#41; 
MM -= 12; 

if &#40;MM == 10 && DD > 10&#41; 
YY--; 

if &#40;MM == 11 || MM == 12&#41; 
YY--; 

if &#40;MM&lt;10&#41; 
CHm = "0" + MM.ToString&#40;&#41; ; 
else 
CHm = MM.ToString&#40;&#41; ; 

if &#40;DD&lt;10&#41; 
CHd = "0" + DD.ToString&#40;&#41; ; 
else 
CHd = DD.ToString&#40;&#41; ; 

return YY.ToString&#40;&#41; + '/' + CHm + '/' + CHd; 
&#125; 

public string systemDayOfWeek&#40;&#41; 
&#123; 
string res=""; 

switch&#40; System.DateTime.Now.DayOfWeek.ToString&#40;&#41; &#41; 
&#123; 
case "Saturday" &#58; 
res = "شنبه"; 
break; 

case "Sunday" &#58; 
res = "یک شنبه" ; 
break; 

case "Monday"&#58; 
res = "دوشنبه"; 
break; 

case "Tuesday"&#58; 
res = "سه شنبه"; 
break; 

case "Wednesday"&#58; 
res = "چهار شنبه"; 
break; 

case "Thursday"&#58; 
res = "پنج شنبه"; 
break; 

case "Friday"&#58; 
res = "جمعه" ; 
break; 
&#125; 

return res ; 

&#125; 

public string systemShamsiDatTime&#40;&#41; 
&#123; 

return 
GetSystemShamsiDate&#40;&#41; + " اکنون " +"\n"+ 
System.DateTime.Now.ToLongTimeString&#40;&#41; +"\n"+ 
System.DateTime.Now.ToLongDateString&#40;&#41; + " " +"\n"+ 
System.DateTime.Now.DayOfWeek + " "+ 
systemDayOfWeek&#40;&#41; ; 
&#125; 

&#125; 
&#125;

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

clsPersianDate m_d = new clsPersianDate&#40;&#41;;  lblDate.Text = m_d.GetSystemShamsiDate&#40;&#41;;	


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

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

----------


## Vahid_Nasiri

یک اسکریپت کامل و بدون نقص برای فارسی نویسی مستقل از سیستم عامل در وب :

&lt;!---------------------------------

var lang = 1;	// 1&#58; Farsi, 0&#58; English

var keys = new Array&#40;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&#41;;


function FKeyDown &#40;&#41;&#123;
 var key = window.event.keyCode;
 if &#40;key == 145&#41;&#123;
    if &#40;lang == 0&#41;
    &#123;
      lang = 1;
      return true;
    &#125;
    else 
    &#123;
      lang = 0;
      return true;
    &#125;
   &#125;
&#125;

function keyConv&#40;&#41;&#123;
 
      if &#40;lang == 1&#41;
      &#123;
	if&#40;&#40;event.keyCode > 38&#41; && &#40;event.keyCode &lt; 123&#41;&#41;&#123;
		event.keyCode = &#40;keys&#91;event.keyCode - 39&#93;&#41;? &#40;keys&#91;event.keyCode - 39&#93;&#41;&#58; event.keyCode; 
	&#125;
      &#125;
&#125;


function strvalidate_fa&#40;str&#41;&#123;
	var i, chr;
	for&#40;i = 0 ; i &lt; str.length ; i++&#41;&#123;
		chr = str.charCodeAt&#40;i&#41;;
		if&#40;!&#40;&#40;chr == 32&#41; || &#40;chr >= 1569 && chr &lt;= 1594&#41; || &#40;chr >= 1601 && chr &lt;= 1610&#41; || &#40;chr == 1662&#41; || &#40;chr == 1670&#41; || &#40;chr == 1688&#41; || &#40;chr == 1711&#41;&#41;&#41; return false;
	&#125;
	return true;
&#125;

//&lt;TEXTAREA class=forms onkeypress="keyConv&#40;&#41;"  onkeydown="FKeyDown&#40;&#41;" dir=rtl name=S1 rows=15 cols=84> &lt;/TEXTAREA>

//-->

----------


## Mohammad_Mnt

:تشویق:

----------


## M-Gheibi

عالیه    :تشویق:   :P  :دلار:

----------


## عزیز

مرسی.عالی بود.

----------


## daneshpazho

واسه تبدیل تاریخ یه راه خیلی ساده تر هم هست 
http://kourdeh.somee.com/cdate.aspx
می تونین یه سربزنین اگه راهش واستون مهمه بگین تا واستون بنویسم .
البته فقط با C#‎ چون وی بی بلد نیستم

----------


## rtech

> واسه تبدیل تاریخ یه راه خیلی ساده تر هم هست 
> http://kourdeh.somee.com/cdate.aspx
> می تونین یه سربزنین اگه راهش واستون مهمه بگین تا واستون بنویسم .
> البته فقط با C#‎ چون وی بی بلد نیستم


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

----------


## daneshpazho

یه سر به 
SYSTEM.GLOBALIZATION
بزن
هر تقویمی که بخواهی توش هست.......................

----------


## rtech

اما تقویم DNN  جاوا اسکریپته !!!

----------

