通过 unicode 缩小 javascript

Minifying javascript via unicode

在 dwitter.net 我经常看到 dweets 被有趣地编码以减少 JS 字符数。

例如https://www.dwitter.net/d/22372 (or https://www.dwitter.net/d/11506)

eval(unescape(escape``.replace(/u../g,'')))

现在我明白了如何解码它并阅读了 javascript,这很简单

unescape(escape``.replace(/u../g,''))

returns

x.font='2em a',x.fillText('\u2620 ',3,25)
t?0:d=x.getImageData(0,0,v=36,v).data
for(c.width|=w=i=936;i--;)e=i%v*6,d[i*4+3]>50||x.fillRect(X=e+e/2*S(t-i/w)+w,i/3-e*C(t-X/99)+e+50,9,i<1?w:9)

但是我不明白的是如何这样编码js。

我注意到这个过程中有一个中间步骤

运行:

escape``

returns

%uD878%uDC2E%uD866%uDC6F%uD86E%uDC74%uD83D%uDC27%uD832%uDC65%uD86D%uDC20%uD861%uDC27%uD82C%uDC78%uD82E%uDC66%uD869%uDC6C%uD86C%uDC54%uD865%uDC78%uD874%uDC28%uD827%uDC5C%uD875%uDC32%uD836%uDC32%uD830%uDC20%uD827%uDC2C%uD833%uDC2C%uD832%uDC35%uD829%uDC0A%uD874%uDC3F%uD830%uDC3A%uD864%uDC3D%uD878%uDC2E%uD867%uDC65%uD874%uDC49%uD86D%uDC61%uD867%uDC65%uD844%uDC61%uD874%uDC61%uD828%uDC30%uD82C%uDC30%uD82C%uDC76%uD83D%uDC33%uD836%uDC2C%uD876%uDC29%uD82E%uDC64%uD861%uDC74%uD861%uDC0A%uD866%uDC6F%uD872%uDC28%uD863%uDC2E%uD877%uDC69%uD864%uDC74%uD868%uDC7C%uD83D%uDC77%uD83D%uDC69%uD83D%uDC39%uD833%uDC36%uD83B%uDC69%uD82D%uDC2D%uD83B%uDC29%uD865%uDC3D%uD869%uDC25%uD876%uDC2A%uD836%uDC2C%uD864%uDC5B%uD869%uDC2A%uD834%uDC2B%uD833%uDC5D%uD83E%uDC35%uD830%uDC7C%uD87C%uDC78%uD82E%uDC66%uD869%uDC6C%uD86C%uDC52%uD865%uDC63%uD874%uDC28%uD858%uDC3D%uD865%uDC2B%uD865%uDC2F%uD832%uDC2A%uD853%uDC28%uD874%uDC2D%uD869%uDC2F%uD877%uDC29%uD82B%uDC77%uD82C%uDC69%uD82F%uDC33%uD82D%uDC65%uD82A%uDC43%uD828%uDC74%uD82D%uDC58%uD82F%uDC39%uD839%uDC29%uD82B%uDC65%uD82B%uDC35%uD830%uDC2C%uD839%uDC2C%uD869%uDC3C%uD831%uDC3F%uD877%uDC3A%uD839%uDC29

然后将正则表达式替换为 .replace(/u../g,''),但是从缩小的 javascript 中获取此字符串对我来说并不容易。

仅 运行encodeURIComponent() 或 escape() 并不能使您到达那里,尽管它可以让您到达那里。

那么如何将 javascript 的字符串转换为包含 %uD 的字符串,然后是每个字符串的字符代码?

我也在推特上。 代码压缩器实际上以一个 dweet (https://www.dwitter.net/d/23092) 开头。 这样做是为了让人们可以通过最多 194 个字符而不是 140 个字符的限制来向他们的演示中添加更多字节。

Note this does not reduce the byte size. Even though this reduces the amount of characters, the size stays the same

https://www.dwitter.net/d/14246

处还有一个解压器

这方面的简化代码是一个简单的解包函数:

function unpack(strange_blocky_code) {
    const index = code.toLowerCase().search(/eval\(unescape\(escape`/g)
                
    if (index >= 0) {
        const start = strange_blocky_code.slice(0, index)
        const end = strange_blocky_code.slice(index)
        const result = eval(end.slice(4))

        if (result) return start + result // returns readable (but trivial) code
    }
}

简化压缩代码为:

function compress(readable_code) {
    const value = [...readable_code.trim()]
    let code = ''

    for (let character of value) {
        const char = character.charCodeAt(0)
        if (char > 255) character = escape(character).replace(/%u/g, "\u")
        code += character
    }

    const compressed =
    String.fromCharCode(...[...code.length % 2 ? code + ";" : code]
        .map((item, index) =>
            item.charCodeAt() | (index % 2 ? 0xDF00 : 0xDB00)
        )
    )

    return `eval(unescape(escape\`${compressed}\`.replace(/u../g,'')))`
}

如果您正在寻找编辑器,我喜欢使用以下两个:

我希望这对您有所帮助。