前言
网上前辈们分享的随机昵称生成方式,都是通过随机获取事先定义的数组内容进行组合来实现随机生成一个类似真名的数据(最近我做的一个项目需求中的,要求随机生成昵称但是不要真名),那这就有点蛋疼了,我总不可能定义很多的中文字符吧,所以首先第一个想到了用Unicode码。
正文
实现思路:
1.随机生成 中文范围内的Unicode码
2.将Unicode码转换成中文
3.循环多次进行拼接
1.随机生成 中文范围内的Unicode码
首先定义一个获取指定范围随机数的方法 (Unicode中文范围:4e00,9fa5)注意: 这个范围是十六进制的所以要么转换成10进制传参进去或者使用js中的十六进制传入 0x代表是十六进制
// 获取指定范围内的随机数
function randomAccess(min,max){
return Math.floor(Math.random() * (min - max) + max)
}
// Unicode中文范围:4e00,9fa5
// 因为这个范围是十六进制所以用十六进制的表示进行传参
//这样我们就拿到了中文范围的Unicode码
randomAccess(0x4e00,0x9fa5)
2.将Unicode码转换成中文
我们需要将刚刚获取到的Unicode转换成中文,在页面上的Unicode显示方式是\u4e00
// 解码
function decodeUnicode(str) {
//Unicode显示方式是\u4e00
str = "\\u"+str
str = str.replace(/\\/g, "%");
//转换中文
str = unescape(str);
//将其他受影响的转换回原来
str = str.replace(/%/g, "\\");
return str;
}
注意:
randomAccess(0x4e00,0x9fa5) 方法获取出来的是 十进制的而页面显示是16进制否则我们拿到的是一些符号而不是中文
// randomAccess(0x4e00,0x9fa5) 方法获取出来的是十进制的
let chineseUnicode = randomAccess(0x4e00,0x9fa5);
let chinese = decodeUnicode(chineseUnicode);
console.log(chinese) // 输出的内容:ぷ
所以我们要转成16进制传参
// 拿到十六进制的 Unicode码
let chineseUnicode = randomAccess(0x4e00,0x9fa5).toString(16);
let chinese = decodeUnicode(chineseUnicode);
console.log(chinese) // 输出的内容:定
3.循环多次进行拼接
我们常用的汉字大概3000多个,所以会大概率的出现不是常用的,有心的朋友可以在继续完善一下
/*
*@param Number NameLength 要获取的名字长度
*/
function getRandomName(NameLength){
let name = ""
for(let i = 0;i<NameLength;i++){
let unicodeNum = ""
unicodeNum = randomAccess(0x4e00,0x9fa5).toString(16)
name += decodeUnicode(unicodeNum)
}
return name
}
let name = getRandomName(2) // 输出
console.log(name) // 输出内容:柎芨
完整代码
// 获取指定范围内的随机数
function randomAccess(min,max){
return Math.floor(Math.random() * (min - max) + max)
}
// 解码
function decodeUnicode(str) {
//Unicode显示方式是\u4e00
str = "\\u"+str
str = str.replace(/\\/g, "%");
//转换中文
str = unescape(str);
//将其他受影响的转换回原来
str = str.replace(/%/g, "\\");
return str;
}
/*
*@param Number NameLength 要获取的名字长度
*/
function getRandomName(NameLength){
let name = ""
for(let i = 0;i<NameLength;i++){
let unicodeNum = ""
unicodeNum = randomAccess(0x4e00,0x9fa5).toString(16)
name += decodeUnicode(unicodeNum)
}
return name
}
let name = getRandomName(2)
console.log(name) // 输出内容:柎芨
2023-04-19 网友优化写法
function getRandomName(length){
function randomAccess(min,max){
return Math.floor(Math.random() * (min - max) + max)
}
let name = ""
for(let i = 0;i<length;i++){
name += String.fromCharCode(randomAccess(0x4E00,0x9FA5))
}
return name
}