技巧百问(6):验证码显示中文

        现在QQ上申请免费号码的验证码是中文的,其实这个也不难,就是随机生成一个16进制的数组,然后根据编码查找汉字,程序如下,此为控制台程序。  

 1 using System;
 2 using System.Text;
 3 
 4 namespace ConsoleApplication 
 5 
 6     class ChineseCode 
 7   { 
 8                public static void Main() 
 9                { 
10                      //输出的控制台 
11               Console.WriteLine(GetGBCode(4)); 
12                     Console.ReadLine();
13            } 
14                /*
17                此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将 
18                四个字节数组存储在object数组中。 
19                参数:strlength,代表需要产生的汉字个数 */
20          
21               public static string GetGBCode(int strlength)
22               { 
23                     //定义一个字符串数组储存汉字编码的组成元素 
24                     string[] rBase=new String [16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}; 
25              
26                     Random rnd=new Random(); 
27          
28                     //定义一个object数组用来 
29                     object[] bytes=new object[strlength];
30                     //定义使用gb2312编码
31                     Encoding gb=Encoding.GetEncoding("gb2312");  
32                     string str="",str1="";
33                     /*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中 
34                     每个汉字有四个区位码组成 
35                     区位码第1位和区位码第2位作为字节数组第一个元素 
36                     区位码第3位和区位码第4位作为字节数组第二个元素*/ 
37                     for(int i=0;i<strlength;i++)           
38                     { 
39                             //区位码第1位 
40                            int r1=rnd.Next(11,14); 
41                            string str_r1=rBase[r1].Trim(); 
42                 
43                            //区位码第2位 
44                            rnd=new Random(r1*unchecked((int)DateTime.Now.Ticks)+i);//更换随机数发生器的种子避免产生重复值 
45                            int r2; 
46                            if(r1==13
47                            { 
48                                   r2=rnd.Next(0,7); 
49                            } 
50                            else
51                            { 
52                                   r2=rnd.Next(0,16); 
53                            } 
54                            string str_r2=rBase[r2].Trim(); 
55                 
56                            //区位码第3位 
57                           rnd=new Random(r2*unchecked((int)DateTime.Now.Ticks)+i); 
58                           int r3=rnd.Next(10,16); 
59                           string str_r3=rBase[r3].Trim(); 
60 
61                           //区位码第4位 
62                           rnd=new Random(r3*unchecked((int)DateTime.Now.Ticks)+i); 
63                           int r4; 
64                           if(r3==10
65                           { 
66                                   r4=rnd.Next(1,16); 
67                           } 
68                           else if (r3==15
69                           { 
70                                   r4=rnd.Next(0,15); 
71                           } 
72                           else 
73                           { 
74                                   r4=rnd.Next(0,16); 
75                           } 
76                           string str_r4=rBase[r4].Trim(); 
77 
78                           //定义两个字节变量存储产生的随机汉字区位码 
79                           byte byte1=Convert.ToByte(str_r1 + str_r2,16); 
80                           byte byte2=Convert.ToByte(str_r3 + str_r4,16); 
81                           //将两个字节变量存储在字节数组中 
82                           byte[] str_r=new byte[]{byte1,byte2}; 
83 
84                           //将产生的一个汉字的字节数组放入object数组中 
85                           bytes.SetValue(str_r,i); 
86                           //根据byte[]中的区位码来查找字
87                           str1=gb.GetString((byte[])Convert.ChangeType(bytes[i], typeof(byte[]))); 
88                           str=str+str1; 
89                     }
90                     return str;
91               } 
92    } 
93 }

实现了随机生成汉字后,就可以使用.net GDI来绘制自己需要的验证码图形了。具体的怎样生成验证码图片,以及改变其中字符的长和宽等效果网上已经有很多相关的文章,这里由于篇幅就不再介绍了。不过有一点要说明的是以上代码在中文版的Windows下才能运行,因为它带有GB的字符集,如果你是其他语言的操作系统,就需要安装GB字符集了。

posted on 2005-10-27 14:09  kkk  阅读(913)  评论(0编辑  收藏  举报