mb_convert_encoding为UTF7字符串提供了iconv以外的其他结果

mb_convert_encoding gives other result than iconv for UTF7 String

本文关键字:iconv 其他 结果 encoding convert UTF7 mb 字符串      更新时间:2023-09-26

InputString:

$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离心机,在那里我没有mb函数。这个字符串是PHP-IDS的一个测试用例,我无法获得相同的结果。

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

在阅读了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})};