این آموزش برای برنامه نویسانی است که می خواهند فایل های دیسکت بیمه با فرمت DBF ایجاد کنند.
می دانیم که کامپیوترها بیتی هستند و تنها با صفر و یک کار می کنند. بنابراین باید به یک سری توافق در مورد نحوه نمایش این صفر و یک ها رسید. این استاندارد ها در حقیقت برای نمایش کاراکترها بکار می روند. کاملا واضح است که استانداردهای مختلف بایت های مختلفی را برای نمایش یک کاراکتر استفاده می کنند. برای درک بهتر این موضوع به دو جدول زیر که از سایت wikipedia گرفته شده است توجه فرمایید.
_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 |
_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 و اسکی داس ایران سیستم را با در نظر گرفتن رخدادهای مختلف ( مثلا حروف چسبان باشند ایجاد می کنیم)
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 استفاده شده است. کد مربوط به این متد و متدهای لازم در آن را در بلوک زیر مشاهده می فرمایید:
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; }
برای ایجاد دیسکت بیمه می توانید از این تبدیل استفاده نمایید.
ورود به سایت