new wings

プログラミングを始めたので、感想を書いてくと思います

javascript で unicode の encode と decode

unicode encoded
 
unicode decoded
 

  // https://github.com/uxitten/polyfill/blob/master/string.polyfill.js
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
  if (!String.prototype.padStart) {
    String.prototype.padStart = function padStart(targetLength, padString) {
      targetLength = targetLength >> 0; //truncate if number, or convert non-number to 0;
      padString = String(typeof padString !== "undefined" ? padString : " ");
      if (this.length >= targetLength) {
        return String(this);
      } else {
        targetLength = targetLength - this.length;
        if (targetLength > padString.length) {
          padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed
        }
        return padString.slice(0, targetLength) + String(this);
      }
    };
  }

  /**
   *
   * @param {string} s
   * @returns number[]
   */
  function unicode_encode_char(s) {
    const len = s.length;
    let x = [];
    for (let i = 0; i < len; i++) {
      x.push(s.charCodeAt(i));
    }
    function padnJoin(x) {
      return x
        .map(function (x) {
          return x.toString(16).padStart(4, "0");
        })
        .join("");
    }
    return padnJoin(x);
  }

  /**
   *
   * @param {string} h
   */
  function unicode_decode_char(h) {
    // 配列の各要素をそれぞれ引数に展開させるために apply を使う
    return String.fromCharCode.apply(
      null,
      h.match(/.{4}/g).map(function (x) {
        return parseInt(x, 16);
      })
    );
    // モダンブラウザではスプレッド演算子が使える
    // return String.fromCharCode(...h.match(/.{4}/g).map((x) => parseInt(x, 16)));
  }

  const str = document.getElementById("str");
  document.getElementById("str").addEventListener("input", function (e) {
    if (e.target.value == "") return;
    const en = unicode_encode_char(e.target.value);
    const de = unicode_decode_char(en);
    const byte = en.match(/.{2}/g) ? en.match(/.{2}/g).length : 0;
    document.getElementById("encoded").innerText = byte + "バイト: " + en;
    document.getElementById("decoded").innerText = de;
  });