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