是否有函数可以做到以下操作?
var specialStr = 'ipsum áá éé lore';
var encodedStr = someFunction(specialStr);
// then encodedStr should be like 'ipsum \u00E1\u00E1 \u00E9\u00E9 lore'
我需要对ASCII范围之外的字符进行编码,并且需要使用该编码。我不知道它的名称。也许是Unicode吗?是否有函数可以做到以下操作?
var specialStr = 'ipsum áá éé lore';
var encodedStr = someFunction(specialStr);
// then encodedStr should be like 'ipsum \u00E1\u00E1 \u00E9\u00E9 lore'
我需要对ASCII范围之外的字符进行编码,并且需要使用该编码。我不知道它的名称。也许是Unicode吗?这应该就可以解决问题:
function padWithLeadingZeros(string) {
return new Array(5 - string.length).join("0") + string;
}
function unicodeCharEscape(charCode) {
return "\\u" + padWithLeadingZeros(charCode.toString(16));
}
function unicodeEscape(string) {
return string.split("")
.map(function (char) {
var charCode = char.charCodeAt(0);
return charCode > 127 ? unicodeCharEscape(charCode) : char;
})
.join("");
}
例如:var specialStr = 'ipsum áá éé lore';
var encodedStr = unicodeEscape(specialStr);
assert.equal("ipsum \\u00e1\\u00e1 \\u00e9\\u00e9 lore", encodedStr);
"aäßåfu".replace(/./g, function(c){return c.charCodeAt(0)<128?c:"\\x"+c.charCodeAt(0).toString(16)})
returns: "a\xe4\xdf\xe5fu"
"ė".replace(/./g, function(c){return c.charCodeAt(0)<128?c:"\\x"+c.charCodeAt(0).toString(16)})
的返回结果是 \x117
,这会带来麻烦。 - some这对我来说有效。特别是在使用Dropbox REST API时:
encodeNonAsciiCharacters(value: string) {
let out = ""
for (let i = 0; i < value.length; i++) {
const ch = value.charAt(i);
let chn = ch.charCodeAt(0);
if (chn <= 127) out += ch;
else {
let hex = chn.toString(16);
if (hex.length < 4)
hex = "000".substring(hex.length - 1) + hex;
out += "\\u" + hex;
}
}
return out;
}
仅供参考,您可以像Domenic所说的那样使用escape
函数,但这将生成具有不同格式(更适合浏览器)的Unicode:
>>> escape("áéíóú");
"%E1%E9%ED%F3%FA"
escape("☃") === "%u2603"
,而 escape("á") === "%E1"
。我想知道他们是如何决定何时切换格式并在开头添加“u”的... - Domenic