写一个汉字与Unicode码的互转的方法
/**
* 汉字与Unicode码互转
*/
const unicodeConverter = {
/**
* 汉字转Unicode码
* @param {string} chineseString 汉字字符串
* @returns {string} Unicode码字符串,例如:\u4f60\u597d
*/
toUnicode(chineseString) {
let unicodeString = '';
for (let i = 0; i < chineseString.length; i++) {
let charCode = chineseString.charCodeAt(i).toString(16);
while(charCode.length < 4) {
charCode = '0' + charCode; // 补齐四位
}
unicodeString += '\\u' + charCode;
}
return unicodeString;
},
/**
* Unicode码转汉字
* @param {string} unicodeString Unicode码字符串,例如:\u4f60\u597d
* @returns {string} 汉字字符串
*/
fromUnicode(unicodeString) {
return unicodeString.replace(/\\u[\dA-Fa-f]{4}/g, match => {
return String.fromCharCode(parseInt(match.replace(/\\u/g, ''), 16));
});
}
};
// 示例用法:
const chineseText = "你好,世界!";
const unicodeText = unicodeConverter.toUnicode(chineseText);
const originalText = unicodeConverter.fromUnicode(unicodeText);
console.log("原始文本:", chineseText);
console.log("Unicode码:", unicodeText);
console.log("转换回文本:", originalText);
// 更简洁的写法 (ES6+) -- 推荐
const toUnicodeES6 = (str) => str.split('').map(char => `\\u${char.charCodeAt(0).toString(16).padStart(4, '0')}`).join('');
const fromUnicodeES6 = (str) => str.replace(/\\u([\dA-Fa-f]{4})/g, (match, p1) => String.fromCharCode(parseInt(p1, 16)));
console.log("Unicode码 (ES6):", toUnicodeES6(chineseText));
console.log("转换回文本 (ES6):", fromUnicodeES6(unicodeText));
// 处理包含代理对的字符 (例如emoji)
const toUnicodeWithSurrogatePairs = (str) => {
return Array.from(str).map(char => {
let code = char.codePointAt(0);
if (code > 0xFFFF) { // 代理对
return `\\u${(code - 0x10000 >> 10 | 0xD800).toString(16)}\\u${(code & 0x3FF | 0xDC00).toString(16)}`;
} else {
return `\\u${code.toString(16).padStart(4, '0')}`;
}
}).join('');
};
const fromUnicodeWithSurrogatePairs = (str) => {
return str.replace(/\\u(?:([\dA-Fa-f]{4})|([\dA-Fa-f]{4})([\dA-Fa-f]{4}))/g, (match, p1, p2, p3) => {
if (p1) {
return String.fromCharCode(parseInt(p1, 16));
} else {
return String.fromCharCode(parseInt(p2, 16), parseInt(p3, 16));
}
});
};
const emojiText = "你好,世界!😂";
const unicodeEmojiText = toUnicodeWithSurrogatePairs(emojiText);
const originalEmojiText = fromUnicodeWithSurrogatePairs(unicodeEmojiText);
console.log("包含emoji的原始文本:", emojiText);
console.log("包含emoji的Unicode码:", unicodeEmojiText);
console.log("包含emoji的转换回文本:", originalEmojiText);
代码解释和改进说明:
toUnicode()
/toUnicodeES6()
: 将汉字字符串转换为Unicode码。 使用charCodeAt()
获取每个字符的Unicode码点,然后用toString(16)
转换为16进制表示。padStart(4, '0')
补齐四位,确保格式为\uXXXX
。 ES6版本更简洁,使用箭头函数和数组方法。- **
fromUnicode()
/ `fromUnicodeES