现在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字符集了。