技巧百问(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  }

实现了随机生成汉字后,就可以使用.net GDI来绘制自己需要的验证码图形了。具体的怎样生成验证码图片,以及改变其中字符的长和宽等效果网上已经有很多相关的文章,这里由于篇幅就不再介绍了。不过有一点要说明的是以上代码在中文版的Windows下才能运行,因为它带有GB的字符集,如果你是其他语言的操作系统,就需要安装GB字符集了。

转载于:https://www.cnblogs.com/cxbkkk/archive/2005/10/27/263100.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值