上一篇写的单纯的数字+字母可能觉得识别难度比较低,所以有些人会采用中文的验证码方式,关于随机生成中文的方法,大家百度下可以看到,基本都是千篇一律了,我在此处就不再赘述了,原理都是差不多的,我们这边用比较简单的方式来实现
这里还是建议大家可以搜索下汉字区位码表,可以看到各汉字对应的区位码,然后直接转化为汉字,我这里贴个图大致描述下
可以看到的是,从1601开始为汉字,每个区都有94个汉字(1694,1794,1894......8794)
实现功能:
- 随机生成中文验证码
开发环境:
开发工具:Visual Studio 2013
.NET Framework版本:4.5
实现代码:
//首先我们需要区位码与汉字相互转换的方法
//汉字分为两部分,都是ASCII码为“160+区码”的字符
//汉字转区位码
public string CodeToChinese(string code)
{
string chinese = "";
byte[] bytes = new byte[2];
string front = code.Substring(0, 2);
string back = code.Substring(2, 2);
bytes[0] = (byte)(Convert.ToInt16(front) + 160);
bytes[1] = (byte)(Convert.ToInt16(back) + 160);
chinese = Encoding.GetEncoding("gb2312").GetString(bytes);
return chinese;
}
//区位码转汉字
public string ChineseToCode(string chinese)
{
string code = "";
byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(chinese);
int front = (short)bytes[0] - 160;
int back = (short)bytes[1] - 160;
code = front.ToString() + back.ToString("D2");
return code;
}
//生成随机汉字
public string GenerateChineseCode(int codeLen = 2)
{
Random rd = new Random();
string code = "";
for (int i = 0; i < codeLen; i++)
{
string s1 = rd.Next(16, 87).ToString();
//这里我前面写的ToString的用法就有用途了
string s2 = rd.Next(1, 94).ToString("D2");
code += CodeToChinese(s1 + s2);
}
return code;
}
//然后直接调用
string code= GenerateChineseCode();
//GenerateImg方法上一篇已写,此篇不赘述,
//中文的话根据需要下Bitmap的宽度以及生成的干扰点或者字体
byte[] bytes = GenerateImg(code);
MemoryStream ms = new MemoryStream(bytes);
Image image = System.Drawing.Image.FromStream(ms);
pictureBox1.Image = image;
实现效果:
我此处只调整了宽度,干扰点还是比较多,所以不太清晰,使用的时候可酌量调整;
Bitmap image = new Bitmap(code.Length * 25, 25);
因为这里采用区位码表中全部汉字,所以出现生僻字的概率比较高,观察下区位码表可以发现;
比如35区之前的生僻字较少,则上面可以改成
string s1 = rd.Next(16, 35).ToString();
string s2 = rd.Next(1, 94).ToString("D2");
code += CodeToChinese(s1 + s2);
由简入繁,拿来即用
后续精彩,持续关注
欢迎关注公众号: dotnet编程大全