/*
功能:十进制的 Unicode 编码转为字符串
用法:
const encodedText = "26469, 28304, 65306, 36164, 28304, 20849, 20139, 32593, 32, 32, 119, 119, 119, 46, 48, 56, 105, 56, 46, 99, 111, 109";
document.getElementById('footer-info').textContent = decodeFooter(encodedText);
document.getElementById('footer-info').innerHTML = decodeFooter(encodedText);
*/
function decodeFooter(encodedText) {
const codeArray = encodedText.split(',').map(Number);
return codeArray.map(code => String.fromCharCode(code)).join('');
}
/*
功能:转字符串转为十进制的 Unicode 编码
用法:
var str = "<a href='http://www.08i8.com'>资源共享网</a>";
console.log(stringToDecimalUnicode(str));
*/
function stringToDecimalUnicode(str) {
return Array.from(str)
.map(char => char.codePointAt(0))
.join(', ');
}
/*
功能:转字符串转十六进制的 Unicode 编码
用法:
var str = "<a href='http://www.08i8.com'>资源共享网</a>";
console.log(stringToUnicode(str));
*/
function stringToUnicode(str) {
return Array.from(str)
.map(char => `${char.codePointAt(0).toString(16)},`)
.join('');
}
/*
功能:把字符串转为2到36进制的Unicode编码
用法:
console.log(stringToUnicode('你好', 16)); // \\u4f60\\u597d
console.log(stringToUnicode('ABC', 2)); // 1000001 1000010 1000011
*/
function stringToUnicode(str, radix = 16) {
let result = '';
for (let i = 0; i < str.length; i++) {
const codePoint = str.codePointAt(i);
// 处理代理对(Surrogate Pair)的字符
if (codePoint > 0xFFFF) i++;
const encoded = codePoint.toString(radix);
result += radix === 16 ? `\\u${encoded.padStart(4, '0')}` : encoded+",";
}
return result;
}
/*
功能:把为2到36进制的Unicode编码转为字符串
用法:
// 十六进制(带\u前缀)
console.log(unicodeToString('\\u4f60\\u597d')); // 输出:"你好"
// 二进制输入
console.log(unicodeToString('1001001 1001100 1001111', 2)); // 输出:"ILO"
// 八进制输入
console.log(unicodeToString('144 154 157', 8)); // 输出:"ILO"
// 自定义进制(如5进制)
console.log(unicodeToString('221 302 1100', 5)); // 输出:"ABC"
*/
function unicodeToString(encodedStr, radix = 16) {
// 处理十六进制带\u前缀的情况
const hexPattern = /\\u([a-f\d]{4,})/gi;
const isHexFormat = hexPattern.test(encodedStr);
// 分割编码单元(考虑空格/逗号分隔的情况)encodedStr.split(",").filter(Boolean)
const codeUnits = isHexFormat
? encodedStr.match(hexPattern).map(u => u.slice(2))
: encodedStr.split(/[\s,]+/).filter(Boolean);
return codeUnits.reduce((str, unit) => {
try {
const codePoint = parseInt(unit, radix);
if (isNaN(codePoint)) throw new Error(`Invalid ${radix}-base code`);
return str + String.fromCodePoint(codePoint);
} catch (e) {
console.warn(`Skipped invalid code unit: ${unit}`);
return str;
}
}, '');
}