javascript - 通过 JavaScript 在 HTML 中正确编码变体选择器
问题描述
在 Unicode 中,变体选择器可以用于多种用途。我使用 VS15 ( ︎
) 来防止浏览器(它们都是错误的)将某些字符显示为表情符号。
我需要对 Unicode 字符 128 及以上进行编码,因为我们发现问题不仅与数据库有关,而且与浏览器错误有关。即使有建议的修复,VS15(变体选择器 15:)︎
也无法正确编码:
HTML,来自数据库,在被渲染之前
😏︎
XML 编码函数和用于呈现 HTML的字符编码函数:
function xml_encode(s)
{
var r = '';
var skip = 0;
for (var i = 0; i < s.length; i++)
{
if (skip > 0) {skip--;}
else if (character_code(s, i) > 127)
{
r += '&#' + character_code(s, i) + ';';
}
else {r += s.charAt(i);}
}
return r;
}
function character_code(s, i)
{
i = i || 0;
var c = s.charCodeAt(i), hi, low;
if (0xD800 <= c && c <= 0xDBFF)
{
hi = c;
low = s.charCodeAt(i + 1);
if (isNaN(low)) {console.log('Error: high surrogate not followed by low surrogate in fixedCharCodeAt()');}
c = ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
}
if (0xDC00 <= c && c <= 0xDFFF) {c = false;}
return c;
}
此代码的一个示例使用是当用户从页面的可视化编辑切换到 XML 编辑时。如何确保对变体选择器进行正确编码?
解决方案
let s = 'a︎';
// U+0061 ‹a› \N{LATIN SMALL LETTER A}
// U+1F60F ‹› \N{SMIRKING FACE}
// U+FE0E ‹◌︎› \N{VARIATION SELECTOR-15}
Array.from(s).map(c => {
const cp = c.codePointAt(0);
return cp < 128 ? c : '&#' + cp + ';';
}).join('')
// 'a😏︎'
推荐阅读
- javascript - 如何从 JS Dynamics crm 打开新形式的捆绑包?
- cobol - Cobol-Restart from the program
- database - 如何避免以连续形式拥有超过 1 个重复的外键?
- node.js - 在 MongoUri 中,我如何处理密码中的 @?
- node.js - 如何在 NodeJS 中过滤多个对象属性值?
- node.js - 在仅包含后端的 Microsoft Azure 中部署 nodejs 项目
- mongodb - Mongo聚合:根据数组字段匹配条件统计文档
- amazon-web-services - 如何在 dynamodb 表中查询没有范围键的分区键?
- java - 未能执行目标 org.apache.maven.plugins:maven-shade-plugin:3.2.3:shade
- python - 如何在线性回归模型中降低 MSE 并提高 R2