目前网上随机生成汉字的源码很多,无外乎生成四个数字,前两个构成区码,后两个构成位,然后使用区位码对应的16进制编码转换成汉字(可参考http://www.cnblogs.com/navicy/archive/2005/05/08/150756.html)。
也就是说,没生成一个汉字,需要生成4个随机数,其实,仔细想想大可不如此麻烦。
研究区位码表(http://www.mytju.com/classCode/tools/QuWeiMa_FullList.asp),我们可以发现:
1. 16进制编码从A1A1开始,即1区1位的编码为A1A1
2. 汉字是从16区开始,87区结束。(B0 - F7)
3. 16区到55区为常用字,且55区后5位(5590 - 5594)未编码。(B0A1 - D7F9)。共3755个
4. 56-87区为生僻字(B1A1 - F7FE)。共3008个。
5. 1-9区为中文符号
6. 每个区的位都是从A1开始FE结束,共94个。
因此,假设我们要生成一个随机的常用字,那么我们完全可以生成一个0-3754的随机数,然后通过其在区位码中的顺序来获取具体的汉字。
博主将汉字的生成拆分成了多个部分。
1. 区域码提供者AreaCodeProvider
2. 常用字提供者SimpleChineseProvider_Often(由多个区域码提供者构成)。
2. 生僻字提供者SimpleChineseProvider_Unique(由多个区域码提供者构成)。
3. 简体字提供者SimpleChineseProvider(由常用字和生僻字提供者构成)。
具体代码请获取源码查看https://[email protected]/APirate/lib.pirate.unit.randomextension.git
另外,为了让使用者可以更方便的使用简体字提供者,我还提供了一个使用枚举调用的方法。用户可以通过枚举,非常方便的选择提供者,常用字、生僻字、或者两者都使用。