【问题标题】:Javascript, convert unicode string to Javascript escape?Javascript,将 unicode 字符串转换为 Javascript 转义?
【发布时间】:2014-01-27 15:57:15
【问题描述】:

我有一个变量,它包含一个由日语字符组成的字符串,例如;

“みどりいろ”

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

我对这个例子的具体结果是:

"\u306f\u3044\u3044\u308d"

如果有变化,我更喜欢 jquery 方法。

【问题讨论】:

  • @SergeiZahharenko - escape("abc") //"abc"...

标签: javascript jquery unicode


【解决方案1】:
"み".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

【讨论】:

  • 我的错 :) 出于某种原因,我错过了 .toString(16) 部分
  • @EladStern - 没关系。
  • 您可以将while(partial.length !== 4) partial = "0" + partial; 替换为我更喜欢的('0000' + partial).substr(-4); :)
  • @Adassko - 好主意。
  • 你也可以用replace函数替换你的循环。那么整个函数将是:return this.replace(/./g, function(c) { return "\\u" + ('000' + c.charCodeAt(0).toString(16)).substr(-4) });:P
【解决方案2】:

只是

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

【讨论】:

  • 赞成,因为这也有效(仅适用于拉丁字母和常见标点符号以外的字符。)
  • 对于 U+0000 到 U+001F、U+007F 到 U+00FF 范围内的字符以及各种标点符号失败。这些字符将escaped 变为%xx 而不是%uxxxx,这会导致无效的反斜杠转义。您必须进行两次替换,一次将%u 替换为\u,然后将另一次替换为%\xtoLowerCase() 也是多余的,并且会丢失未转义字符的信息。
  • 这是否通过 The Pile of Poo Test™ ? :P
【解决方案3】:

以上答案是合理的。轻微的空间和性能优化:

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

【讨论】:

    【解决方案4】:

    我有这个问题的答案。我制作的这个功能对我有用。仅将非 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("")
    }
    

    【讨论】:

    • 这适用于某些字符,但对于像 ✓ 这样的“更高”字符则不起作用。来自 stackoverflow.com/a/40558081/3434804 下面的 Adam Leggett 的代码完成了工作。
    【解决方案5】:

    我的代码版本,基于以前的答案。我使用 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"}
    

    【讨论】:

      【解决方案6】:

      只需使用 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")
      "みどりいろ"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        • 2010-12-09
        • 1970-01-01
        • 2020-03-15
        相关资源
        最近更新 更多