最终效果如图:
CheckCode.aspx.cs代码如下
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 //获取GB2312编码页(表)
4 /**//**
5 * 生成中文验证验码所要使用的方法
6 * 注,生成中文验证码时要改变一下生成验证码图片的宽度
7 * var imageCode = new System.Drawing.Bitmap((int)Math.Ceiling((code.Length * 22.5)), 23); //定义图片的宽度和高度
8 **/
9
10 //var gb = Encoding.GetEncoding("gb2312");
11
12 /**/////调用函数产生4个随机中文汉字编码
13 //object[] bytes = CreateRegionCode(4);
14
15 /**/////根据汉字编码的字节数组解码出中文汉字
16 //var sbCode = new StringBuilder().Append(gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[]))))
17 // .Append(gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[]))))
18 // .Append(gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[]))))
19 // .Append(gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[]))));
20 //CreateCheckCodeImage(sbCode.ToString());
21
22 CreateCheckCodeImage(GenerateCheckCode()); //生成数字英文所要使用的方法
23 }
24
25 生成汉字验证码#region 生成汉字验证码
26 /**//// <summary>
27 /// 此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将四个字节数组存储在object数组中。
28 /// </summary>
29 /// <param name="strLength">代表需要产生的汉字个数</param>
30 /// <returns></returns>
31 static object[] CreateRegionCode(int strLength)
32 {
33 var rBase = new[]
34 {
35 "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"
36 };
37
38 var random = new Random();
39 var bytes = new object[strLength];
40
41 /**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
42 每个汉字有四个区位码组成
43 区位码第1位和区位码第2位作为字节数组第一个元素
44 区位码第3位和区位码第4位作为字节数组第二个元素
45 */
46
47 for (int i = 0; i < strLength; i++)
48 {
49 //区位码第1位
50 var r1 = random.Next(11, 14);
51 var str_r1 = rBase[r1].Trim();
52
#p#副标题#e#
53 random = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i); //更换随机数发生器的种子避免产生重复值
54
55 var r2 = 0;
56 if (r1 == 13)
57 r2 = random.Next(0, 7);
58 else
59 r2 = random.Next(0, 16);
60
61 var str_r2 = rBase[r2].Trim();
62
63 //区位码第3位
64 random = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
65 var r3 = random.Next(10, 16);
66 var str_r3 = rBase[r3].Trim();
67
68 //区位码第4位
69 random = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
70 var r4 = 0;
71 if (r3 == 10)
72 r4 = random.Next(1, 16);
73 else if (r3 == 15)
74 r4 = random.Next(0, 15);
75 else
76 r4 = random.Next(0, 16);
77
78 var str_r4 = rBase[r4].Trim();
79
80 var byte1 = Convert.ToByte(str_r1 + str_r2, 16);
81 var byte2 = Convert.ToByte(str_r3 + str_r4, 16);
82 //将两个字节变量存储在字节数组中
83 var str_r = new[] { byte1, byte2 };
84
85 //将产生的一个汉字的字节数组放入object数组中
86 bytes.SetValue(str_r, i);
87  
关键词标签:.NET,中英文验证码
相关阅读
热门文章 手把手教你用好LINQ to SQL在.NET环境下为网站增加IP过滤功能ASP.NET 如何避免页面重新整理时重复送出用Asp.net扩展ExtJS
人气排行 asp.net表单提交方法GET\POST在ASP.NET中如何判断用户IE浏览器的版本Asp.net中messagebox的实现方法Asp.net中的web.config配置在ASP.NET MVC中实现大文件异步上传用Iformattable接口控制.Net中文本格式c#.Net经典面试题目用Asp.net扩展ExtJS
查看所有0条评论>>