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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM