【问题标题】:Escape unicode (%u2014) in javascript or in C#/.NET?在 javascript 或 C#/.NET 中转义 unicode (%u2014)?
【发布时间】:2013-04-18 16:43:05
【问题描述】:

我在互联网的狂野西部找到了%u2014(实际上是关于烂番茄的评论)。我记得在javascript中看到过类似的东西。我不记得它是否在字符串中,但我认为它是某种转义或 uri 转义。

我尝试在控制台中运行 decodeURIComponent('%u2014') 并得到 URIError: malformed URI sequence。有谁知道如何解码这个字符?出于某种原因,我想到了\x,但我不确定为什么。

如何解码这个 unicode 字符?

【问题讨论】:

  • 你可以试试JSON.parse('"\u2014"')

标签: javascript .net unicode escaping


【解决方案1】:

%uNNNN 格式来自 JavaScript 函数 escape() - 它看起来有点像 URL 编码,但实际上不是,它是一种自定义(无意义)JS 特定的编码类型。

如果您是从 JavaScript 代码处理它,那么明显的解药是 unescape()

【讨论】:

    【解决方案2】:

    为此,您可以为此模式使用 RegExp 并从匹配项中进行字符解码。 Afaik %uXXXX 格式不是推荐的做法。

    var decodeUE = (function () {
        var reg = /%u([\dA-F]{4})|%([\dA-F]{2})/ig,
            helper = function (m, a, b) {
                if (a) return String.fromCharCode(parseInt(a, 16));
                if (b) return String.fromCharCode(parseInt(b, 16));
            };
        return function decodeUE(s) {
            return s.replace(reg, helper);
        };
    }());
    
    var enc = '%u2014 %33 %AF %u1A2B';
    
    decodeUE(enc); // "— 3 ¯ ᨫ"
    

    【讨论】:

    • 反之,考虑'—'.charCodeAt(0).toString(16); // "2014",但您必须有某种白名单,因为我们不会编码每个字符。
    • 快速提示。您可以使用 return String.fromCharCode(parseInt(a?a:b, 16)); 而不是两个 if 语句。演示jsfiddle.net/S33MS
    • @acidzombie24 你也可以parseInt(a||b, 16) 有很多选择;)我选择是为了清楚起见,请随时改进! :D
    • 这行得通吗?我认为它会返回一个布尔值并给我一个 1 :|。我试过a|b 但这不起作用
    • a|b is bitwise => 将转换为 int (意味着 x|0 是一个巧妙的技巧,如果在 dec 中快速转换)。 || 是合乎逻辑的,a||b => 如果a 不是 是假的,则返回a,否则返回b,没有强制转换为布尔值。您可以将a ? a : b 视为与a && a || b 相同(但只是因为|| 会短路,因为&& 的LHS true 意味着RHS true) ,简化为a || bJavaScript 就是这么疯狂。
    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2015-11-08
    • 2014-01-27
    • 2020-04-25
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多