javascript - mb_convert_encoding 对于 UTF7 字符串给出除 iconv 之外的其他结果

标签 javascript node.js unicode encoding character-encoding

输入字符串:

$value = "ACM=1,1+eval(1+name+(+ACM-1),ACM)";

使用 mb_convert_encoding 的方法

mb_convert_encoding($value, 'UTF-8', 'UTF-7');

使用 iconv 的方法

iconv("utf-7", "utf-8//IGNORE", $value);

mb_convert_encoding 的结果不同

ACM=1,1競(1鶩(#1),ACM)

对于 iconv

ACM=1,1競뗺皦(#1),ACM)

我的问题是,我想运行一个用 JS 实现的 PHP-IDS Centrifuge,但我没有 mb 函数。该字符串是 PHP-IDS 的测试用例,我无法获得相同的结果。

有人知道,我如何用 js 得到与 mb 相同的结果吗?还是mb中的一个错误?

最佳答案

阅读 RFC 2152 后,在我看来 mb_convert_encoding 在处理格式错误的输入方面非常严格,并且 iconv 正在尝试进行硬清理。 但我认为我得到了想要的行为:

function convertUTF7toUTF8(string) {
    var b64Token = /\+([a-z\d\/+]*\-?)/gi,
        hex, len, replace, i;

    return string.replace(b64Token, function(match, grp) {
        hex = Buffer(grp, 'base64');
        len = hex.length >> 1 << 1;
        replace = '';
        i = 1;

        for(i; i < len; i = i + 2) {
            replace += String.fromCharCode(hex.readUInt16BE(i - 1));
        }

        return replace;
    });
}

最小化:

function convertUTF7toUTF81(s){return s.replace(/\+([a-z\d\/+]*\-?)/gi,function(m,a){var i=0,c='',h=Buffer(a,'base64'),l=h.length>>1<<1-1;while(i<l)c+=String.fromCharCode(h.readUInt16BE(i++*2));return c})};

关于javascript - mb_convert_encoding 对于 UTF7 字符串给出除 iconv 之外的其他结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18396905/

相关文章:

javascript - React 中的 useEffect 清理函数中的 refs 数组包含空值

javascript - CKEditor 中的 "Code"按钮

javascript - 如何将 "callback pyramid"重构为基于 promise 的版本

javascript - 为什么 NodeJS* 事件循环在我的 Promise 之后继续?

unicode - python编码转换

Javascript 等价于 python 的 .format()

javascript - 将其传递给 jQuery 插件

javascript - 在 Google Cloud 存储桶上传之前解决 Promise

python - 如何在 Python 中从数据库中读取非英文字符?

python - 如何在 Git Bash/WinPTY 下使用 Python3 获得 REPL/箭头键功能和 Unicode 字符