C# 中文验证码

上一篇写的单纯的数字+字母可能觉得识别难度比较低,所以有些人会采用中文的验证码方式,关于随机生成中文的方法,大家百度下可以看到,基本都是千篇一律了,我在此处就不再赘述了,原理都是差不多的,我们这边用比较简单的方式来实现

这里还是建议大家可以搜索下汉字区位码表,可以看到各汉字对应的区位码,然后直接转化为汉字,我这里贴个图大致描述下

可以看到的是,从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);

由简入繁,拿来即用

更多精彩,请关注微信公众号:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值