程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .net 隨機生成漢字

.net 隨機生成漢字

編輯:C#入門知識

.net 隨機生成漢字。本站提示廣大學習愛好者:(.net 隨機生成漢字)文章只能為提供參考,不一定能成為您想要的結果。以下是.net 隨機生成漢字正文


在沒講.net若何隨機生成漢字之前先給年夜家講下漢字編碼構成及道理。

1、漢字編碼道理

  究竟怎樣辦到隨機生成漢字的呢?漢字從哪裡來的呢?是否是有個後台數據表,個中寄存了所須要的一切漢字,應用法式

隨機掏出幾個漢字組合就好了呢?應用後台數據庫先將一切漢字存起來應用時隨機取

出,這也是一種方法,然則中文漢字有這麼多,怎樣來制造呢?其實可以不應用任何後台數據庫,應用法式就可以做到這一切。

要曉得若何生成漢字,就得先懂得中文漢字的編碼道理。

  1980年,為了使每個漢字有一個全國同一的代碼,我國公布了第一個漢字編碼的國度尺度:GB2312-80《信息交流用漢

字編碼字符集》根本集,簡稱GB2312,這個字符集是我國中文信息處置技巧的

成長基本,也是國際一切漢字體系的同一尺度。到了後來又頒布了國度尺度GB18030-2000《信息交流用漢字編碼字符集根本

集的擴大》,簡稱GB18030,編程時假如觸及到編碼和當地化的同伙應當對GB18030很熟

悉。這是是我國繼GB2312-1980和GB13000-1993以後最主要的漢字編碼尺度,同時也是將來我國盤算機體系必需遵守的基本

性尺度之一。

  今朝在中文WINDOWS操作體系中,.NET編程中默許的的代碼頁就是GB18030簡體中文。然則現實上假如生成中文漢字驗

證碼只需要應用GB2312字符集就曾經足夠了。字符集中除我們日常平凡年夜家都熟悉的漢字外

,也包括了許多我們不熟悉日常平凡也很少見到的漢字。假如生成中文漢字驗證碼中有許多我們不熟悉的漢字讓我們輸出,關於使

用拼音輸出法的同伙來講可不是功德,五筆應用者還能委曲依據漢字的長相打出來,

呵呵!所以關於GB2312字符集中的漢字我們也不是全都要用。

中文漢字字符可使用區位碼來表現,見其實這兩個表是統一回事,只不外一個應用十六進制分區表現,一個應用區位地點的

數字地位表現。 例如“好”字的十六進制區位碼是ba c3,前兩位是區域,後兩位代表地位,ba處在第26區,“好”處在此

區漢字的第35位也就是c3地位,所以數字代碼就是2635。這就是GB2312漢字區位道理。依據《漢字區位碼表 》我們可以發明

第15區也就是AF區之前都沒有漢字,只要大批符號,漢字都從第16區B0開端,這就是

為何GB2312字符集都是從16區開端的。

2、.Net法式處置漢字編碼道理剖析

在.Net中可使用System.Text來處置一切說話的編碼。在System.Text定名空間中包括浩瀚編碼的類,可供停止操作及轉換。其

中的Encoding類就是重點處置漢字編碼的類。經由過程在.NET文檔中查詢Encoding類的

辦法我們可以發明一切和文字編碼有關的都是字節數組,個中有兩個很好用的辦法:

Encoding.GetBytes ()辦法將指定的 String 或字符數組的全體或部門內容編碼為字節數組

Encoding.GetString ()辦法將指定字節數組解碼為字符串。


沒錯我們可以經由過程這兩個辦法將漢字字符編碼為字節數組,異樣曉得了漢字GB2312的字節數組編碼也便可以將字節數組解碼為漢字字符。經由過程對“好”字停止編碼為字節數組後


Encoding gb=System.Text.Encoding.GetEncoding("gb2312");
object[] bytes=gb.Encoding.GetBytes ("好");

發明獲得了一個長度為2的字節數組bytes,應用


string lowCode = System.Convert.ToString(bytes[0], 16); //掏出元素1編碼內容(兩位16進制)
string hightCode = System.Convert.ToString(bytes[1], 16);//掏出元素2編碼內容(兩位16進制)

  以後發明字節數組bytes16進制變碼後內容居然是{ba,c3},恰好是“好”字的十六進制區位碼(見區

位碼表)。

  是以我們便可以隨機生成一個長度為2的十六進制字節數組,應用GetString ()辦法對其停止解碼便可以獲得漢字字符了。不

過關於生成中文漢字驗證碼來講,由於第15區也就是AF區之前都沒有漢字,只要

大批符號,漢字都從第16區B0開端,而且從區位D7開端今後的漢字都是和很難見到的復雜漢字,所以這些都要排出失落。所以隨

機生成的漢字十六進制區位碼第1位規模在B、C、D之間,假如第1位是D的話,第2位

區位碼就不克不及是7今後的十六進制數。在來看看區位碼表發明每區的第一個地位和最初一個地位都是空的,沒有漢字,是以隨機

生成的區位碼第3位假如是A的話,第4位就不克不及是0;第3位假如是F的話,第4位就

不克不及是F。

 好了,曉得了道理,隨機生成中文漢字的法式也就出來了,以下就是生成4個隨機漢字的C#掌握台代碼:


/// <summary>
/// 隨機生成漢字
/// </summary>
/// <param name="strlength">長度(4位)</param>
/// <returns></returns>
public string CreateCode(int strlength)
{
//界說一個字符串數組貯存漢字編碼的構成元素
string[] r = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
Random rnd = new Random();
//界說一個object數組用來
object[] bytes = new object[strlength];
/**/
/*每輪回一次發生一個含兩個元素的十六進制字節數組,並將其放入bject數組中

每一個漢字有四個區位碼構成

區位碼第1位和區位碼第2位作為字節數組第一個元素

區位碼第3位和區位碼第4位作為字節數組第二個元素


*/
for (int i = 0; i < strlength; i++)
{
//區位碼第1位
int r1 = rnd.Next(11, 14);
string str_r1 = r[r1].Trim();
//區位碼第2位
rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//改換隨機數產生器的種子防止發生反復值
int r2;
if (r1 == 13)
r2 = rnd.Next(0, 7);
else
r2 = rnd.Next(0, 16);
string str_r2 = r[r2].Trim();
//區位碼第3位
rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
int r3 = rnd.Next(10, 16);
string str_r3 = r[r3].Trim();
//區位碼第4位
rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
int r4;
if (r3 == 10)
{
r4 = rnd.Next(1, 16);
}
else if (r3 == 15)
{
r4 = rnd.Next(0, 15);
}
else
{
r4 = rnd.Next(0, 16);
}
string str_r4 = r[r4].Trim();
//界說兩個字節變量存儲發生的隨機漢字區位碼
byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
//將兩個字節變量存儲在字節數組中
byte[] str_r = new byte[] { byte1, byte2 };
//將發生的一個漢字的字節數組放入object數組中
bytes.SetValue(str_r, i);
}
//獲得GB2312編碼頁(表)
Encoding gb = Encoding.GetEncoding("gb2312");
//依據漢字編碼的字節數組解碼出中文漢字
string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
string str4 = gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
string txt = str1 + str2 + str3 + str4;
return txt;
}

以上代碼完成隨機生成漢字,以上有一點須要解釋代碼在中文版windows下能力運轉,由於帶有gb的字符集,假如你的電腦是其他說話的操作體系,須要裝置GB字符集。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved