技巧百问(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 }
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字符集了。