openkava

专注物流系统,企业信息化,进出口业务,会展,电子商务 目标:CIO 架构师
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

zz生成中文验证码的函数

Posted on 2007-09-05 14:19  openkava  阅读(231)  评论(0)    收藏  举报
代码存为gb.ashx ,就可以输出中文图片

<%
 @ webhandler language="C#" class="Sbm.Web.ApplicationCenter.test.gb"    %>
 
using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using Sbm.Web.Common;
namespace Sbm.Web.ApplicationCenter.test
{
 
    
public class gb : IHttpHandler,IReadOnlySessionState 
    {     
        
int intLength = 5;               //长度
        string strIdentify = "Identify"//随机字串存储键值,以便存储到Session中    
        public bool IsReusable
        { 
get { return true; } }
        
public void ProcessRequest(HttpContext hc)
        {
            
//设置输出流图片格式
            hc.Response.ContentType = "image/gif";
            
string v1 =hc.Request["s"];
            Bitmap b 
= new Bitmap(20060);
            Graphics g 
= Graphics.FromImage(b);
            g.FillRectangle(
new SolidBrush(Color.YellowGreen), 0020060);
            Font font 
= new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);
            Random r 
= new Random();
 
            
//合法随机显示字符列表
            string strLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
            StringBuilder s 
= new StringBuilder();
     
     
     
     
     
//获取GB2312编码页(表)
            Encoding gb=Encoding.GetEncoding("gb2312");
 
            
//调用函数产生4个随机中文汉字编码
            object[] bytes=CreateRegionCode(4); 
 
            
//根据汉字编码的字节数组解码出中文汉字
            string str1=gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
            
string str2=gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
            
string str3=gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
            
string str4=gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
 
             
         
string gbzhi= str1 + str2 +str3 +str4 ;
                       
//hc.Response.Write(gbzhi);
    
            
//将随机生成的字符串绘制到图片上
            for (int i = 0; i < intLength; i++)
            {
                s.Append(strLetters.Substring(r.Next(
0, strLetters.Length - 1), 1));
            
                g.DrawString(s[s.Length 
- 1].ToString(), font, new SolidBrush(Color.Blue), i * 38, r.Next(015));
             
            }
     g.DrawString(gbzhi, font, 
new SolidBrush(Color.Red), 00);
                    
                                   
            
//生成干扰线条
            Pen pen = new Pen(new SolidBrush(Color.Blue), 2);
            
for (int i = 0; i < 10; i++)
            {
                g.DrawLine(pen, 
new Point(r.Next(0199), r.Next(059)), new Point(r.Next(0199), r.Next(059)));
            }
                        

 
            b.Save(hc.Response.OutputStream, ImageFormat.Gif);
            
if(hc.Session !=null)
                hc.Session[strIdentify] 
= s.ToString().ToLower(); //先保存在Session中,验证与用户输入是否一致
          
            
//hc.Response.ClearContent();   
            
//hc.Response.ContentType = "image/Gif";   
            
//hc.Response.BinaryWrite(ms.ToArray());  
            hc.Response.End();
        }
     
     
    
/**//*
        此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将
        四个字节数组存储在object数组中。
        参数:strlength,代表需要产生的汉字个数
        
*/
        
public static object[] CreateRegionCode(int strlength)
        {
            
//定义一个字符串数组储存汉字编码的组成元素
            string[] rBase=new String [16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
            
            Random rnd
=new Random();
        
            
//定义一个object数组用来
            object[] bytes=new object[strlength];
 
            
/**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
             每个汉字有四个区位码组成
             区位码第1位和区位码第2位作为字节数组第一个元素
             区位码第3位和区位码第4位作为字节数组第二个元素
            
*/
            
for(int i=0;i<strlength;i++)
            {
                
//区位码第1位
                int r1=rnd.Next(11,14);
                
string str_r1=rBase[r1].Trim();
 
                
//区位码第2位
                rnd=new Random(r1*unchecked((int)DateTime.Now.Ticks)+i);//更换随机数发生器的种子避免产生重复值
                int r2;
                
if (r1==13)
                {
                    r2
=rnd.Next(0,7);
                }
                
else
                {
                    r2
=rnd.Next(0,16);
                }
                
string str_r2=rBase[r2].Trim();
 
                
//区位码第3位
                rnd=new Random(r2*unchecked((int)DateTime.Now.Ticks)+i);
                
int r3=rnd.Next(10,16);
                
string str_r3=rBase[r3].Trim();
 
                
//区位码第4位
                rnd=new Random(r3*unchecked((int)DateTime.Now.Ticks)+i);
                
int r4;
                
if (r3==10)
                {
                    r4
=rnd.Next(1,16);
                }
                
else if (r3==15)
                {
                    r4
=rnd.Next(0,15);
                }
                
else
                {
                    r4
=rnd.Next(0,16);
                }
                
string str_r4=rBase[r4].Trim();
 
                
//定义两个字节变量存储产生的随机汉字区位码
                byte byte1=Convert.ToByte(str_r1 + str_r2,16);
                
byte byte2=Convert.ToByte(str_r3 + str_r4,16);
                
//将两个字节变量存储在字节数组中
                byte[] str_r=new byte[]{byte1,byte2};
 
                
//将产生的一个汉字的字节数组放入object数组中
                bytes.SetValue(str_r,i);
                
            }
 
            
return bytes;
 
            }

}
}