最终效果如图:
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
53 random = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i); //更换随机数发生器的种子避免产生重复值
54