首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mb_convert_encoding给出了UTF7字符串的康涅夫以外的其他结果。

mb_convert_encoding给出了UTF7字符串的康涅夫以外的其他结果。
EN

Stack Overflow用户
提问于 2013-08-23 07:07:45
回答 1查看 2.4K关注 0票数 1

InputString:

代码语言:javascript
复制
$value = "ACM=1,1+eval(1+name+(+ACM-1),ACM)";

使用mb_convert_encoding的方法

代码语言:javascript
复制
mb_convert_encoding($value, 'UTF-8', 'UTF-7');

用iconv方法

代码语言:javascript
复制
iconv("utf-7", "utf-8//IGNORE", $value);

结果不同,对于mb_convert_encoding

代码语言:javascript
复制
ACM=1,1競(1鶩(#1),ACM)

表示iconv

代码语言:javascript
复制
ACM=1,1競뗺皦(#1),ACM)

我的问题是,我想运行一个在JS中实现的PHP离心机,在那里我没有mb函数。这个字符串是PHP的一个测试用例,我无法获得相同的结果。

有人知道,我是如何得到和js一样的结果的吗?或者是mb中的一个bug?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-23 18:45:52

在阅读了RFC 2152之后,在我看来,mb_convert_encoding在处理格式错误的输入方面非常严格,而iconv正试图进行严格的消毒。但我想我被通缉的行为掩盖了:

代码语言:javascript
复制
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;
    });
}

最小化:

代码语言:javascript
复制
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})};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18396905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档