1

入力文字列:

$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)

アイコン用

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

私の問題は、mb 関数を持たない JS で実装された PHP-IDS Centrifuge を実行したいということです。この文字列は PHP-IDS によるテストケースであり、これと同じ結果を得ることができません。

jsでmbと同じ結果を得るにはどうすればよいですか?それともmbのバグですか?

4

1 に答える 1

0

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})};
于 2013-08-23T18:45:52.207 に答える