JavaScript,将Unicode字符串转换为JavaScript转义符?

25

我有一个变量,其中包含由日本字符组成的字符串,例如:

"みどりいろ"

我该如何将其转换为 Javascript 转义形式?

对于这个特定的例子,我需要的结果是:

"\u306f\u3044\u3044\u308d"

如果有 jquery 的方法,我更喜欢使用它。


1
@SergeiZahharenko - escape("abc") //"abc"... @SergeiZahharenko - escape(“abc”)//“abc”... - Derek 朕會功夫
6个回答

41
"み".charCodeAt(0).toString(16);

这将给你Unicode编码(以十六进制表示)。你可以通过循环运行它:

String.prototype.toUnicode = function(){
    var result = "";
    for(var i = 0; i < this.length; i++){
        // Assumption: all characters are < 0xffff
        result += "\\u" + ("000" + this[i].charCodeAt(0).toString(16)).substr(-4);
    }
    return result;
};

"みどりいろ".toUnicode();       //"\u307f\u3069\u308a\u3044\u308d"
"Mi Do Ri I Ro".toUnicode();  //"\u004d\u0069\u0020\u0044\u006f\u0020\u0052\u0069\u0020\u0049\u0020\u0052\u006f"
"Green".toUniCode();          //"\u0047\u0072\u0065\u0065\u006e"

演示: http://jsfiddle.net/DerekL/X7MCy/

更多信息请查看:.charCodeAt


@EladStern - 没关系。 - Derek 朕會功夫
1
你也可以用 replace 函数来代替循环。整个函数如下:return this.replace(/./g, function(c) { return "\\u" + ('000' + c.charCodeAt(0).toString(16)).substr(-4) }); :P - Adassko
@Adassko - 我之前没有想过这个问题,但我认为为每个字符创建一个新的匿名函数比使用for循环更慢且消耗更多内存。尽管差别非常小,大约慢5%。 (http://jsperf.com/looping-through-a-string) - Derek 朕會功夫
@Derek朕會功夫 我有十六進制Unicode,如何將其轉換為普通文本? - Santosh Jadi
@SantoshJadi 它是如何表示的? - Derek 朕會功夫
显示剩余9条评论

12

上面的答案是合理的。稍微优化一下空间和性能:

function escapeUnicode(str) {
    return str.replace(/[^\0-~]/g, function(ch) {
        return "\\u" + ("000" + ch.charCodeAt().toString(16)).slice(-4);
    });
}

6

只需

escape("みどりいろ")

大多数情况下,这应该满足需求。但是如果你需要以"\u"的形式而不是"%xx" / "%uxxxx"的形式,则可以使用正则表达式:

escape("みどりいろ").replace(/%/g, '\\').toLowerCase()

escape("みどりいろ").replace(/%u([A-F0-9]{4})|%([A-F0-9]{2})/g, function(_, u, x) { return "\\u" + (u || '00' + x).toLowerCase() });

(toLowerCase 是可选的,让它看起来与第一篇文章完全相同)

它在大多数情况下不需要转义字符,这对你来说可能是一个优点;如果不是,请参见 Derek 的答案,或使用我的版本:

'\\u' + "みどりいろ".split('').map(function(t) { return ('000' + t.charCodeAt(0).toString(16)).substr(-4) }).join('\\u');

因为这也适用于除拉丁字母和常见标点符号以外的字符,所以被点赞了。 - Derek 朕會功夫
对于Unicode编码范围在U+0000到U+001F、U+007F到U+00FF以及各种标点符号的字符,该方法会失败。这些字符被转义为%xx而不是%uxxxx,导致反斜杠转义无效。您需要进行两次替换,一次将%u替换为\u,然后再将%替换为\x。此外,toLowerCase()是多余的,并且会丢失未转义字符的信息。 - bobince
这是否通过了大便测试™? :P - törzsmókus

1

根据之前的答案,这是我编写的代码版本。我使用if语句在JSON.stringify()中转换非UTF8字符。

const toUTF8 = string =>
    string.split('').map(
        ch => !ch.match(/^[^a-z0-9\s\t\r\n_|\\+()!@#$%^&*=?/~`:;'"\[\]\-]+$/i)
            ? ch
            : '\\' + 'u' + '000' + ch.charCodeAt(0).toString(16)
    ).join('');

使用方法:

JSON.stringify({key: 'Категория дли импорта'}, (key, value) => {
    if (typeof value === "string") {
        return toUTF8(value);
    }

    return value;
});

返回JSON:
{"key":"\\u00041a\\u000430\\u000442\\u000435\\u000433\\u00043e\\u000440\\u000438\\u00044f \\u000434\\u00043b\\u000438 \\u000438\\u00043c\\u00043f\\u00043e\\u000440\\u000442\\u000430"}

那些\u序列毫无意义。 - SamB

0

只需使用encodeURI函数:

encodeURI("みどりいろ")
"%E3%81%BF%E3%81%A9%E3%82%8A%E3%81%84%E3%82%8D"

另一方面将其解码回来:

decodeURI("%E3%81%BF%E3%81%A9%E3%82%8A%E3%81%84%E3%82%8D")
"みどりいろ"

-1

我对这个问题有一个答案。我写的这个函数对我很有效。它只将非 utf-8 字符编码为 Unicode。

function toUnicode(word){
       let array = word.split("");
       array =  array.map((character)=>{
                if(character.match(/[^a-zA-Z]/g)){
                    let conversion = "000" + character.charCodeAt(0).toString(16)
                    return "\\u" + conversion;
                 }
                 return character;
});
return array.join("")
}

1
这适用于一些字符,但对于像 ✓ 这样的“高级”字符则不适用。以下是 Adam Leggett 的代码 https://dev59.com/xWEi5IYBdhLWcg3wueN0#40558081,可以完成任务。 - pojda

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