سبد (0)

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

آموزش تبدیل کد پیج فارسی ویندوز (windows-1256) به فارسی داس ایران سیستم

این آموزش برای برنامه نویسانی است که می خواهند دیسکت بیمه ایجاد کنند.

می دانیم که کامپیوترها بیتی هستند و تنها با صفر و یک کار می کنند. بنابراین باید به یک سری توافق در مورد نحوه نمایش این صفر و یک ها رسید. این استاندارد ها در حقیقت برای نمایش کاراکترها بکار می روند. 

کاملا واضح است که استانداردهای مختلف بایت های مختلفی را برای نمایش یک کاراکتر استفاده می کنند. برای درک بهتر این موضوع به دو جدول زیر که از سایت wikipedia گرفته شده است توجه فرمایید.


استاندارد فارسی ایران سیستم Iran System
  _0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
 
8_
 
۰
06F0
128
۱
06F1
129
۲
06F2
130
۳
06F3
131
۴
06F4
132
۵
06F5
133
۶
06F6
134
۷
06F7
135
۸
06F8
136
۹
06F9
137
،
060C
138
ـ
0640
139
؟
061F
140

FE81
141

FE8B
142*
ء
0621
143
 
9_
 

FE8D
144

FE8E
145

FE8F
146*

FE91
147**

FB56
148*

FB58
149**

FE95
150*

FE97
151**

FE99
152*

FE9B
153**

FE9D
154*

FE9F
155**

FB7A
156*

FB7C
157**

FEA1
158*

FEA3
159**
 
A_
 

FEA5
160*

FEA7
161**
د
062F
162
ذ
0630
163
ر
0631
164
ز
0632
165
ژ
0698
166

FEB1
167

FEB3
168

FEB5
169

FEB7
170

FEB9
171

FEBB
172

FEBD
173
ﺿ
FEBF
174
ط
0637
175
 
B_
 

2591
176

2592
177

2593
178

2502
179

2524
180

2561
181

2562
182

2556
183

2555
184

2563
185

2551
186

2557
187

255D
188

255C
189

255B
190

2510
191
 
C_
 

2514
192

2534
193

252C
194

251C
195

2500
196

253C
197

255E
198

255F
199

255A
200

2554
201

2569
202

2566
203

2560
204

2550
205

256C
206

2567
207
 
D_
 

2568
208

2564
209

2565
210

2559
211

2558
212

2552
213

2553
214

256B
215

256A
216

2518
217

250C
218

2588
219

2584
220

258C
221

2590
222

2580
223
 
E_
 
ظ
0638
224

FEC9
225*

FECA
226**

FECC
227*

FECB
228**

FECD
229*

FECE
230**

FED0
231*

FECF
232**

FED1
233*

FED3
234**

FED5
235*

FED7
236**

FB8E
237*

FB90
238**

FB92
239*
 
F_
 

FB94
240**

FEDD
241*

FEFB
242*

FEDF
243**

FEE1
244*

FEE3
245**

FEE5
246*

FEE7
247**
و
0648
248

FEE9
249*

FEEC
250

FEEB
251

FBFD
252

FBFC
253

FBFE
254**
NBSP
00A0
255
  _0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F

فارس ویندوز استاندارد Windows-1256
  _0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
 
0_
 
NUL
0000
0
SOH
0001
1
STX
0002
2
ETX
0003
3
EOT
0004
4
ENQ
0005
5
ACK
0006
6
BEL
0007
7
BS
0008
8
HT
0009
9
LF
000A
10
VT
000B
11
FF
000C
12
CR
000D
13
SO
000E
14
SI
000F
15
 
1_
 
DLE
0010
16
DC1
0011
17
DC2
0012
18
DC3
0013
19
DC4
0014
20
NAK
0015
21
SYN
0016
22
ETB
0017
23
CAN
0018
24
EM
0019
25
SUB
001A
26
ESC
001B
27
FS
001C
28
GS
001D
29
RS
001E
30
US
001F
31
 
2_
 
SP
0020
32
!
0021
33
"
0022
34
#
0023
35
$
0024
36
%
0025
37
&
0026
38
'
0027
39
(
0028
40
)
0029
41
*
002A
42
+
002B
43
,
002C
44
-
002D
45
.
002E
46
/
002F
47
 
3_
 
0
0030
48
1
0031
49
2
0032
50
3
0033
51
4
0034
52
5
0035
53
6
0036
54
7
0037
55
8
0038
56
9
0039
57
:
003A
58
;
003B
59
<
003C
60
=
003D
61
>
003E
62
?
003F
63
 
4_
 
@
0040
64
A
0041
65
B
0042
66
C
0043
67
D
0044
68
E
0045
69
F
0046
70
G
0047
71
H
0048
72
I
0049
73
J
004A
74
K
004B
75
L
004C
76
M
004D
77
N
004E
78
O
004F
79
 
5_
 
P
0050
80
Q
0051
81
R
0052
82
S
0053
83
T
0054
84
U
0055
85
V
0056
86
W
0057
87
X
0058
88
Y
0059
89
Z
005A
90
[
005B
91
\
005C
92
]
005D
93
^
005E
94
_
005F
95
 
6_
 
`
0060
96
a
0061
97
b
0062
98
c
0063
99
d
0064
100
e
0065
101
f
0066
102
span style="font-size: large; font-family: monospace">g
0067
103
h
0068
104
i
0069
105
j
006A
106
k
006B
107
l
006C
108
m
006D
109
n
006E
110
o
006F
111
 
7_
 
p
0070
112
q
0071
113
r
0072
114
s
0073
115
t
0074
116
u
0075
117
v
0076
118
w
0077
119
x
0078
120
y
0079
121
z
007A
122
{
007B
123
|
007C
124
}
007D
125
~
007E
126
DEL
007F
127
 
8_
 

20AC
128
پ
067E
129

201A
130
ƒ
0192
131

201E
132

2026
133

2020
134

2021
135
ˆ
02C6
136

2030
137
ٹ
0679
138

2039
139
Œ
0152
140
چ
0686
141
ژ
0698
142
ڈ
0688
143
 
9_
 
گ
06AF
144

2018
145

2019
146

201C
147

201D
148

2022
149

2013
150

2014
151
ک
06A9
152

2122
153
ڑ
0691
154

203A
155
œ
0153
156
ZWNJ
200C
157
ZWJ
200D
158
ں
06BA
159
 
A_
 
NBSP
00A0
160
،
060C
161
¢
00A2
162
£
00A3
163
¤
00A4
164
¥
00A5
165
¦
00A6
166
§
00A7
167
¨
00A8
168
©
00A9
169
ھ
06BE
170
«
00AB
171
¬
00AC
172
SHY
00AD
173
®
00AE
174
¯
00AF
175
 
B_
 
°
00B0
176
±
00B1
177
²
00B2
178
³
00B3
179
´
00B4
180
µ
00B5
181

00B6
182
·
00B7
183
¸
00B8
184
¹
00B9
185
؛
061B
186
»
00BB
187
¼
00BC
188
½
00BD
189
¾
00BE
190
؟
061F
191
 
C_
 
ہ
06C1
192
ء
0621
193
آ
0622
194
أ
0623
195
ؤ
0624
196
إ
0625
197
ئ
0626
198
ا
0627
199
ب
0628
200
ة
0629
201
ت
062A
202
ث
062B
203
ج
062C
204
ح
062D
205
خ
062E
206
د
062F
207
 
D_
 
ذ
0630
208
ر
0631
209
ز
0632
210
س
0633
211
ش
0634
212
ص
0635
213
ض
0636
214
×
00D7
215
ط
0637
216
ظ
0638
217
ع
0639
218
غ
063A
219
ـ
0640
220
ف
0641
221
ق
0642
222
ك
0643
223
 
E_
 
à
00E0
224
ل
0644
225
â
00E2
226
م
0645
227
ن
0646
228
ه
0647
229
و
0648
230
ç
00E7
231
è
00E8
232
é
00E9
233
ê
00EA
234
ë
00EB
235
ى
0649
236
ی
064A
237
î
00EE
238
ï
00EF
239
 
F_
 
ً
064B
240
ٌ
064C
241
ٍ
064D
242
َ
064E
243
ô
00F4
244
ُ
064F
245
ِ
0650
246
÷
00F7
247
ّ
0651
248
ù
00F9
249
ْ
0652
250
û
00FB
251
ü
00FC
252
LRM
200E
253
RLM
200F
254
ے
06D2
255
  _0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F

جدول اولی استاندارد فارسی داس ایران سیستم است و جدول بعدی استاندارد فارسی ویندوز 1256 است.

همانگونه که نشان داده شده است تفاوت های زیر در دو استاندارد موجود است:

  • کد اسکی تمام کاراکترهای مشابه با همدیگر متفاوت است. برای مثال ن در فارسی داس ایران سیستم دارای کد اسکی 246 و در فارسی ویندوز دارای کد اکسی 228 است.
  • در فارسی داس ایران سیستم بین حروف اول و حروف آخر تمایز وجود دارد مثلا ن آخر دارای کد 246  و ن چسبان دارای کد 247 می باشد.
  • در فارسی داس ایران سیستم دو حرف لا دارای تنها یک کد اسکی می باشد . آن هم 242 می باشد.

با توجه به موارد ذکر شده برای ایجاد الگوریتم تبدیل فارسی ویندوز به داس و بالعکس باید موارد زیر را در نظر داشت:

  • ایجاد دیکشنری هایی که نگاشت بین کد اسکی فارسی ویندوز و فارسی داس را انجام می دهند.
  • تبدیل متن فارسی ویندوز به آرایه ای از کدهای اسکی متناظر
  • حرکت بین کاراکترهای یک متن و نگاشت کدهای اسکی بدست آمده به کدهای اسکی فارسی داس
  • مد نظر قرار دادن استثناها و حروف آخر
  • مد نظر قرار دادن پرانتزها، آکولاد و غیره ( "{" به جای "}" این و بالعکس

ابتدا کلاسی ایجاد نمایید و آن را کلاس ConvertWindowsPersianToDos نام گذاری کنید.

کلاس تبدیل فارسی ویندوز به داس ایران سیستم ConvertWindowsPersianToDos 

public class ConvertWindowsPersianToDos
}

{

سپس چهار دیکشنری که نگاشت بین کدهای اسکی ویندوز 1256 و اسکی داس ایران سیستم را با در نظر گرفتن رخدادهای مختلف ( مثلا حروف چسبان باشند ایجاد می کنیم)

Title

   public Dictionary CharachtersMapper_Group1 = new Dictionary<byte,byte>
        {
            
        {48 , 128}, // 0
        {49 , 129}, // 1
        {50 , 130}, // 2
        {51 , 131}, // 3
        {52 , 132}, // 4
        {53 , 133}, // 5
        {54 , 134}, // 6
        {55 , 135}, // 7
        {56 , 136}, // 8
        {57 , 137}, // 9
        {161, 138}, // ،
        {191, 140}, // ؟
        {193, 143}, //ء 
        {194, 141}, // آ
        {195, 144}, // أ
        {196, 248}, //ؤ  
        {197, 144}, //إ
        {200, 146}, //ب 
        {201, 249}, //ة
        {202, 150}, //ت
        {203, 152}, //ث 
        {204, 154}, //ﺝ
        {205, 158}, //ﺡ
        {206, 160}, //ﺥ
        {207, 162}, //د
        {208, 163}, //ذ
        {209, 164}, //ر
        {210, 165},//ز
        {211, 167},//س
        {212, 169},//ش
        {213, 171}, //ص
        {214, 173}, //ض
        {216, 175}, //ط
        {217, 224}, //ظ
        {218, 225}, //ع
        {219, 229}, //غ
        {220, 139}, //-
        {221, 233},//ف
        {222, 235},//ق
        {223, 237},//ك
        {225, 241},//ل
        {227, 244},//م
        {228, 246},//ن
        {229, 249},//ه
        {230, 248},//و
        {236, 253},//ى
        {237, 253},//ی
        {129, 148},//پ
        {141, 156},//چ
        {142, 166},//ژ
        {152, 237},//ک
        {144, 239},//گ


           };
        public Dictionary<byte, byte> CharachtersMapper_Group2 = new Dictionary<byte, byte>
        {
       {48,128},//
       {49,129},//
       {50,130},
       {51,131},//
       {52,132},//
       {53,133},
       {54,134},//
       {55,135},//
       {56,136},
       {57,137},//
       {161,138},//،
       {191,140},//?
       {193,143},//ء
       {194,141},//آ
       {195,144},//أ
       {196,248},//ؤ
       {197,144},//إ
       {198,254},//ئ
       {199,144},//ا
       {200,147},//ب
       {201,251},//ة
       {202,151},//ت
       {203,153},//ث
       {204,155},//ج
       {205,159},//ح
       {206,161},//خ
       {207,162},//د
       {208,163},//ذ
       {209,164},//ر
       {210,165},//ز
       {211,168},//س
       {212,170},//ش
       {213,172},//ص
       {214,174},//ض
       {216,175},//ط
       {217,224},//ظ
       {218,228},//ع
       {219,232},//غ
       {220,139},//-
       {221,234},//ف
       {222,236},//ق
       {223,238},//ك
       {225,243},//ل
       {227,245},//م
       {228,247},//ن
       {229,251},//ه
       {230,248},//و
       {236,254},//ی
       {237,254},//ی
       {129,149},//پ
       {141 ,157},//چ
       {142,166},//ژ
       {152,238},//ک
       {144,240},//گ
       
       
        };

        public Dictionary<byte, byte> CharachtersMapper_Group3 = new Dictionary<byte, byte>
        {
                 
        {48 , 128}, // 0
        {49 , 129}, // 1
        {50 , 130}, // 2
        {51 , 131}, // 3
        {52 , 132}, // 4
        {53 , 133}, // 5
        {54 , 134}, // 6
        {55 , 135}, // 7
        {56 , 136}, // 8
        {57 , 137}, // 9
        {161, 138}, // ،
        {191, 140}, // ؟
        {193, 143}, //
        {194, 141}, //
        {195, 145}, //
        {196, 248}, //
        {197, 145}, // 
        {198, 252}, //
        {199, 145}, // 
        {200, 146}, // 
        {201, 249}, //
        {202, 150}, //
        {203, 152}, // 
        {204, 154}, //
        {205, 158}, // 
        {206, 160}, //
        {207, 162}, //
        {208, 163}, // 
        {209, 164}, //
        {210, 165}, //
        {211, 167}, // 
        {212, 169}, // 
        {213, 171}, //
        {214, 173}, // 
        {216, 175}, // 
        {217, 224}, //
        {218, 226}, // 
        {219, 230}, // 
        {220, 139}, //
        {221, 233}, // 
        {222, 235}, //
        {223, 237}, //
        {225, 241}, // 
        {227, 244}, //
        {228, 246}, //
        {229, 249}, //   
        {230, 248}, // 
        {236, 252}, //
        {237, 252}, // 
        {129, 148}, // 
        {141, 156}, //
        {142, 166}, // 
        {152, 237}, // 
        {144, 239}//
};
         public Dictionary<byte, byte> CharachtersMapper_Group4= new Dictionary<byte, byte>
        {
            {48 , 128}, // 0
            {49 , 129}, // 1
            {50 , 130}, // 2
            {51 , 131}, // 3
            {52 , 132}, // 4
            {53 , 133}, // 5
            {54 , 134}, // 6
            {55 , 135}, // 7
            {56 , 136}, // 8
            {57 , 137}, // 9
            {161, 138}, // ،
            {191, 140}, // ؟
            {193,143}, //
            {194,141}, //
            {195,145}, //
            {196,248}, // 
            {197,145}, // 
            {198,254}, //
            {199,145}, // 
            {200,147}, // 
            {201,250}, //
            {202,151}, //
            {203,153}, //
            {204,155}, //
            {205,159}, //
            {206,161}, //
            {207,162}, //
            {208,163}, //
            {209,164}, //
            {210,165}, //
            {211,168}, // 
            {212,170}, //
            {213,172}, //
            {214,174}, //
            {216,175}, // 
            {217,224}, //
            {218,227}, //
            {219,231}, //
            {220,139}, //
            {221,234}, //
            {222,236}, //
            {223,238}, //
            {225,243}, //
            {227,245}, // 
            {228,247}, //
            {229,250}, //
            {230,248}, //
            {236,254}, //
            {237,254}, // 
            {129,149}, //
            {141,157}, //
            {142,166}, // 
            {152,238}, // 
            {144,240}, //
};


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

توابع مورد نیاز برای چک حروف لاتین

public bool is_Lattin_Letter(byte c)
{
     if (c < 128 && c > 31)
     {
         return true;
     }
        return false;
        
}
public byte get_Lattin_Letter(byte c) { if ("0123456789".IndexOf((char) c)>=0 ) return (byte)(c+80); return get_FarsiExceptions(c); } private byte get_FarsiExceptions(byte c) { switch (c) { case (byte)'(': return (byte)')' ; case (byte)'{': return (byte)'}'; case (byte)'[': return (byte)']'; case (byte)')': return (byte)'('; case (byte)'}': return (byte)'{'; case (byte)']': return (byte)'['; default: return (byte)c; } }

افزودن سایر توابع برای بررسی استثناهای موجود و تمایز بین حروف چسبان و حروف آخر

افزودن توابع برای بررسی استثناها

public bool is_Final_Letter(byte c)
{
      string s="ءآأؤإادذرزژو";
             
      if ( s.ToString().IndexOf((char)c)>=0)
      {
          return true;
		 
       }
           return false;
 }
public bool IS_White_Letter(byte c)
{
    if (c== 8 || c== 09 || c== 10 || c== 13 || c==27 || c== 32 || c== 0 )
    {
        return true;
    }
    return false;
}
public bool Char_Cond(byte c)
{
    return IS_White_Letter(c)
        || is_Lattin_Letter(c)
        || c==191;
}



در نهایت باید توابع مورد نظر را فراخوانی کرد. منتها باید قبل از آن متن را به بایت های اسکی تبدیل کرد. 

افزودن کدهای مورد نیاز 

   public List get_Unicode_To_IranSystem(string Unicode_Text)
        {
           
// " رشته ای که فارسی است را دو کاراکتر فاصله به ابتدا و انتهایآن اضافه می کنیم
string unicodeString = " "+Unicode_Text+" "; //ایجاد دو انکدینگ متفاوت Encoding ascii = //Encoding.ASCII; Encoding.GetEncoding("windows-1256"); Encoding unicode = Encoding.Unicode; // تبدیل رشته به بایت byte[] unicodeBytes = unicode.GetBytes(unicodeString); // تبدیل بایتها از یک انکدینگ به دیگری byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes); // Convert the new byte[] into a char[] and then into a string. char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)]; ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0); string asciiString = new string(asciiChars); byte[] b22 = Encoding.GetEncoding("windows-1256").GetBytes(asciiChars); int limit = b22.Length; byte pre=0, cur=0; List IS_Result = new List(); for (int i = 0; i < limit; i++) { if(is_Lattin_Letter(b22[i])) { cur= get_Lattin_Letter( b22[i]); IS_Result.Add(cur); pre = cur; } else if(i!=0 && i!=b22.Length-1) { cur = get_Unicode_To_IranSystem_Char(b22[i - 1], b22[i], b22[i + 1]);
if (cur== 145) // برای بررسی استثنای لا { if (pre==243) { IS_Result.RemoveAt(IS_Result.Count - 1); IS_Result.Add(242); } else { IS_Result.Add(cur); } } else { IS_Result.Add(cur); } pre = cur; } } return IS_Result; }

 در متد بالا از متد get_Unicode_To_IranSystem_Char استفاده شده است. کد مربوط به این متد و متدهای لازم در آن را در بلوک زیر مشاهده می فرمایید:

Title

 public byte get_Unicode_To_IranSystem_Char(byte PreviousChar, byte CurrentChar , byte NextChar)
        {
          
            bool PFlag = Char_Cond(PreviousChar) || is_Final_Letter(PreviousChar);
            bool NFlag =Char_Cond(NextChar);
            if (PFlag && NFlag) return UCTOIS_Group_1(CurrentChar);
            else if (PFlag) return UCTOIS_Group_2(CurrentChar);
            else if (NFlag) return UCTOIS_Group_3(CurrentChar);

             return UCTOIS_Group_4(CurrentChar);

        }

        private byte UCTOIS_Group_4(byte CurrentChar)
        { 
          
            if (CharachtersMapper_Group4.ContainsKey(CurrentChar))
            {
                return (byte)CharachtersMapper_Group4[CurrentChar];
            }
            return (byte)CurrentChar;
        }

        private byte UCTOIS_Group_3(byte CurrentChar)
        {
            if (CharachtersMapper_Group3.ContainsKey(CurrentChar))
            {
                return (byte)CharachtersMapper_Group3[CurrentChar];
            }
            return (byte)CurrentChar;
        }

        private byte UCTOIS_Group_2(byte CurrentChar)
        {
            if (CharachtersMapper_Group2.ContainsKey(CurrentChar))
            {
                return (byte)CharachtersMapper_Group2[CurrentChar];
            }
            return (byte)CurrentChar;
        }
        private byte UCTOIS_Group_1(byte CurrentChar)
        {
            if (CharachtersMapper_Group1.ContainsKey(CurrentChar))
            {
                return (byte)CharachtersMapper_Group1[CurrentChar];
            }
            return (byte)CurrentChar;
        }

برای ایجاد دیسکت بیمه می توانید از این تبدیل استفاده نمایید.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه