Mi código actual convierte los caracteres en entidades como se esperaba. Pero si convierto emoji, genera algo como �� para 🤩 que no se muestra como se esperaba.
String.prototype.toHtmlEntities = function() { return this.replace(/./gm, function(s) { // return "&#" + s.charCodeAt(0) + ";"; return (s.match(/[a-z0-9\s]+/i)) ? s : "&#" + s.charCodeAt(0) + ";"; }); }; console.log("🤩".toHtmlEntities()) document.write("🤩".toHtmlEntities())Está iterando sobre las unidades de código de su cadena. En su lugar, desea iterar sobre los puntos de código . La mayoría de los emojis consisten en un punto de código, que está codificado por dos unidades de código llamadas pares sustitutos: uno alto y otro bajo. Los pares sustitutos cuando se muestran de forma independiente no representan un símbolo válido, lo que termina con la representación � . Si usa el indicador u (unicode) en su expresión regular, su . luego coincidirá en función de los puntos de código, lo que le permitirá iterar sobre cada punto de código (en lugar de la unidad de código). Luego puede acceder al valor del punto de código usando codePointAt(0) , que luego puede codificar en una entidad HTML:
String.prototype.toHtmlEntities = function() { return this.replace(/./ugm, s => s.match(/[a-z0-9\s]+/i) ? s : "&#" + s.codePointAt(0) + ";"); }; console.log("a".toHtmlEntities()); document.write("a".toHtmlEntities()); console.log("&".toHtmlEntities()); document.write("&".toHtmlEntities()); console.log("😍".toHtmlEntities()); // surrogate pair test document.write("😍".toHtmlEntities()); console.log("👨👩👧👦".toHtmlEntities()); // ZWJ test document.write("👨👩👧👦".toHtmlEntities()); console.log("❤️".toHtmlEntities()); // variation selector test document.write("❤️".toHtmlEntities()); // variation selector test console.log("ñ".toHtmlEntities()); // decomposed character test (length of 2) document.write("ñ".toHtmlEntities()); // decomposed character test (length of 2) console.log("ñ".toHtmlEntities()); // composed character (length of 1) document.write("ñ".toHtmlEntities()); // composed character (length of 1)