写一个汉字与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
posted @ 2024-12-02 09:17  王铁柱6  阅读(70)  评论(0)    收藏  举报