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

你可能感兴趣的:(字符串)