C# 随机生成中文字符串

  1 using System;
  2 using System.Text;
  3 
  4 <font color=red>
  5 /// 可以随机生成一个长度为2的十六进制字节数组,
  6 /// 使用GetString ()方法对其进行解码就可以得到汉字字符了。
  7 /// 不过对于生成中文汉字验证码来说,因为第15区也就是AF区以前都没有汉字,
  8 /// 只有少量符号,汉字都从第16区B0开始,并且从区位D7开始以后的汉字都是和很难见到的繁杂汉字,
  9 /// 所以这些都要排出掉。所以随机生成的汉字十六进制区位码第1位范围在B、C、D之间,
 10 /// 如果第1位是D的话,第2位区位码就不能是7以后的十六进制数。
 11 /// 在来看看区位码表发现每区的第一个位置和最后一个位置都是空的,没有汉字,
 12 /// 因此随机生成的区位码第3位如果是A的话,第4位就不能是0;第3位如果是F的话,
 13 /// 第4位就不能是F。知道了原理,随机生成中文汉字的程序也就出来了, 
 14 
 15 /// 以下就是生成长度为N的随机汉字C#台代码:
 16 </font>
 17 public class RandomChinese
 18 {
 19     public RandomChinese()
 20     {
 21     }
 22 
 23     public string GetRandomChinese(int strlength)
 24     {
 25         // 获取GB2312编码页(表) 
 26         Encoding gb = Encoding.GetEncoding("gb2312");
 27 
 28         object[] bytes = this.CreateRegionCode(strlength);
 29 
 30         StringBuilder sb = new StringBuilder();
 31 
 32         for (int i = 0; i < strlength; i++)
 33         {
 34             string temp = gb.GetString((byte[])Convert.ChangeType(bytes[i], typeof(byte[])));
 35             sb.Append(temp);
 36         }
 37 
 38         return sb.ToString();
 39     }
 40 
 41     /** 
 42     此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将 
 43     四个字节数组存储在object数组中。 
 44     参数:strlength,代表需要产生的汉字个数 
 45     **/    
 46     private object[] CreateRegionCode(int strlength)
 47     {
 48         //定义一个字符串数组储存汉字编码的组成元素 
 49         string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
 50 
 51         Random rnd = new Random();
 52 
 53         //定义一个object数组用来 
 54         object[] bytes = new object[strlength];
 55 
 56         /**
 57          每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bytes数组中 
 58          每个汉字有四个区位码组成 
 59          区位码第1位和区位码第2位作为字节数组第一个元素 
 60          区位码第3位和区位码第4位作为字节数组第二个元素 
 61         **/
 62         for (int i = 0; i < strlength; i++)
 63         {
 64             //区位码第1位 
 65             int r1 = rnd.Next(11, 14);
 66             string str_r1 = rBase[r1].Trim();
 67 
 68             //区位码第2位 
 69             rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i); // 更换随机数发生器的 种子避免产生重复值 
 70             int r2;
 71             if (r1 == 13)
 72             {
 73                 r2 = rnd.Next(0, 7);
 74             }
 75             else
 76             {
 77                 r2 = rnd.Next(0, 16);
 78             }
 79             string str_r2 = rBase[r2].Trim();
 80 
 81             //区位码第3位 
 82             rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
 83             int r3 = rnd.Next(10, 16);
 84             string str_r3 = rBase[r3].Trim();
 85 
 86             //区位码第4位 
 87             rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
 88             int r4;
 89             if (r3 == 10)
 90             {
 91                 r4 = rnd.Next(1, 16);
 92             }
 93             else if (r3 == 15)
 94             {
 95                 r4 = rnd.Next(0, 15);
 96             }
 97             else
 98             {
 99                 r4 = rnd.Next(0, 16);
100             }
101             string str_r4 = rBase[r4].Trim();
102 
103             // 定义两个字节变量存储产生的随机汉字区位码 
104             byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
105             byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
106             // 将两个字节变量存储在字节数组中 
107             byte[] str_r = new byte[] { byte1, byte2 };
108 
109             // 将产生的一个汉字的字节数组放入object数组中 
110             bytes.SetValue(str_r, i);
111         }
112 
113         return bytes;
114     }
115 }

转自:http://blog.csdn.net/xjj51296646/article/details/3928428

posted @ 2015-04-07 15:29  Luck_红手  阅读(2676)  评论(0编辑  收藏  举报