在javascript中,我试图使unicode成为与C兼容的基于字节的十六进制转义序列:
即。
变成:\xF0\x9F\x98\x84 (正确)
不是javascript代理,不是\uD83D\uDE04 (错误)
我无法计算出C想要的四个字节与javascript使用的两个代理之间的数学关系。我怀疑这个算法比我微弱的尝试要复杂得多。
谢谢你的建议。
发布于 2015-08-01 13:20:08
encodeURIComponent做了以下工作:
var input = "\uD83D\uDE04";
var result = encodeURIComponent(input).replace(/%/g, "\\x"); // \xF0\x9F\x98\x84Upd:实际上,C字符串可以包含数字和字母,而不需要转义,但是如果您真的需要转义它们:
function escape(s, escapeEverything) {
if (escapeEverything) {
s = s.replace(/[\x10-\x7f]/g, function (s) {
return "-x" + s.charCodeAt(0).toString(16).toUpperCase();
});
}
s = encodeURIComponent(s).replace(/%/g, "\\x");
if (escapeEverything) {
s = s.replace(/\-/g, "\\");
}
return s;
}发布于 2015-08-01 13:09:14
在这里找到了一个解决方案:http://jonisalonen.com/2012/from-utf-16-to-utf-8-in-javascript/
我就不会想出那个数学了,哇。
有点儿缩小
function UTF8seq(s) {
var i,c,u=[];
for (i=0; i < s.length; i++) {
c = s.charCodeAt(i);
if (c < 0x80) { u.push(c); }
else if (c < 0x800) { u.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f)); }
else if (c < 0xd800 || c >= 0xe000) { u.push(0xe0 | (c >> 12), 0x80 | ((c>>6) & 0x3f), 0x80 | (c & 0x3f)); }
else { i++; c = 0x10000 + (((c & 0x3ff)<<10) | (s.charCodeAt(i) & 0x3ff));
u.push(0xf0 | (c >>18), 0x80 | ((c>>12) & 0x3f), 0x80 | ((c>>6) & 0x3f), 0x80 | (c & 0x3f)); }
}
for (i=0; i < u.length; i++) { u[i]=u[i].toString(16); }
return '\\x'+u.join('\\x');
}https://stackoverflow.com/questions/31761980
复制相似问题