//字符串编码转为unicode编码
function charToUnicode(str) {
let temp;
let i = 0;
let r = '';
for (let val of str) {
temp = val.codePointAt(0).toString(16);
while ( temp.length < 4 )
temp = '0' + temp;
r += '\\u' + temp;
};
return r;
}
//unicode编码转为字符串编码
function unicodeToChar(str){
//方案一
return eval("'" + str + "'");
//方案二
return unescape(str.replace(/\u/g, "%u"));
}
//js获取字符串长度(字符真实个数)
//由于es5之前都将此类四个字节组成的字符"𠮷"("𠮷".length == 2)处理成2个长度,所以使用"for of"方法可以正确遍历字符串的长度
function getLength(str){
let length = 0;
for(let val of str){
length++
}
return length
}
//codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。
function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}
is32Bit("𠮷") // true
is32Bit("啊") // false
is32Bit("a") // false
//实际使用中,一般设计会认为中文字符如'啊','哦','额',','等理解为为两个长度,英文字符和数字如'a','1',','等理解为为一个长度,所以此方法可以获取他们认为的字符串长度(注意,不是字符串的真是长度,只是设计师理解的长度)
function getViewLength(str){
let length = 0;
for (let c of str){//注意使用for of可以正确的遍历字符串的长度,而其他方法会将"𠮷"当成两个长度遍历
if(c.codePointAt(0) > 0x00FF){length = length + 2}//不管是两个字节的字符如'啊',还是四个字节的字符'𠮷',都'当成'是属于两个字符长度的范围
else{
length++
}
}
return length
}
扩展
自定义加密(这里有些限制,数值不能太大)
这里做个延伸 通过将 unicode 编码转换成 toString(10) 然后转成 number 类型 在通过 ^ 异或进行转换 这样就进行加密了
如 ---> 加密 34 ^ 3 = 33 解密 33 ^ 3 = 34
解密思路: 将加密后的值通过 ^(异或) 运算符 进行反转 得到 加密前的的值 然后通过将 该值转换成 16 进制(如果本来加班前就是16进制就不用再转了) 再通过 '\\u${十六进制}' 转译就可以得到原理加密的值了
简单字符串加密
const key = 313;
function encryption(str) {
let s = '';
str.split('').map(item => {
s += handle(item);
})
return s;
}
function decryption(str) {
let s = '';
str.split('').map(item => {
s += handle(item);
})
return s;
}
function handle(str) {
if (/\d/.test(str)) {
return str ^ key;
} else {
let code = str.charCodeAt();
let newCode = code ^ key;
return String.fromCharCode(newCode);
}
}
let init = 'hello world 位运算';
let result = encryption(init); // őŜŕŕŖęŎŖŋŕŝę乴軩窮
let decodeResult = decryption(result); // hello world 位运算