需要在JavaScript中转义非ASCII字符

10

是否有函数可以做到以下操作?

var specialStr = 'ipsum áá éé lore';
var encodedStr = someFunction(specialStr);
// then encodedStr should be like 'ipsum \u00E1\u00E1 \u00E9\u00E9 lore'
我需要对ASCII范围之外的字符进行编码,并且需要使用该编码。我不知道它的名称。也许是Unicode吗?

@mplungjan 这与URI编码无关;两个链接的问题都与OP想要的不同。 - Domenic
请参考 http://www.javascripter.net/faq/escape.htm 或者更好的是 https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Core_Language_Features#Unicode。 - yoozer8
请参阅此处的内容 在Javascript中将特殊字符转换为HTML - mplungjan
2
@mplungjan,你似乎又没有仔细阅读问题。 - Domenic
@Domenic - 我同意,我删除了第一个链接,但最后一个链接更相关(不是被接受的答案,而是其他一些答案),我反对“再次”。 - mplungjan
4个回答

19

这应该就可以解决问题:

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

非常感谢Domenic,我会使用这个解决方案的 ;) - Hanoi

3
如果你需要十六进制编码而不是Unicode,则可以简化@Domenic的答案为:
"aäßåfu".replace(/./g, function(c){return c.charCodeAt(0)<128?c:"\\x"+c.charCodeAt(0).toString(16)})

returns: "a\xe4\xdf\xe5fu"

你知道 charcode 可以大于 255 吗? "ė".replace(/./g, function(c){return c.charCodeAt(0)<128?c:"\\x"+c.charCodeAt(0).toString(16)}) 的返回结果是 \x117,这会带来麻烦。 - some

1

这对我来说有效。特别是在使用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;
    }

1

仅供参考,您可以像Domenic所说的那样使用escape函数,但这将生成具有不同格式(更适合浏览器)的Unicode:

>>> escape("áéíóú");
"%E1%E9%ED%F3%FA"

1
有趣的是:escape("☃") === "%u2603",而 escape("á") === "%E1"。我想知道他们是如何决定何时切换格式并在开头添加“u”的... - Domenic
2
啊,好吧,MDN说:“转义和反转义函数对于非ASCII字符无法正常工作,并已被弃用。”:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions 所以也许这就是不一致性的根源。 - Domenic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接