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;
});