【问题标题】:IMAP UTF-7 conversion with native Javascript使用原生 Javascript 进行 IMAP UTF-7 转换
【发布时间】:2020-03-21 21:44:24
【问题描述】:

我一直在尝试处理一个好的代码,该代码将提供用于将 IMAP UTF7 邮箱转换为 JS 到 UTF-16 字符串的 Javascript。似乎没有完成这样的工作。你们中的任何人都建造了其中一个或有一个可以分享吗?我很高兴构建一个,但如果有人已经拥有它,我不想这样做。

当我查看规范时,看起来 '&' 和 '-' 之间的字符串首先使用 base64 解码,然后解码为 UTF-16 Big Endian,以及将非 ascii 文本编码为 UTF-16 的相反过程部分,然后是base64。对于文件安全操作,base64 +/ 表示为 +,而不是其他情况下的 +_。

如果有人有解决方案,请告诉我,我很乐意使用它或编写一个并将其放入 Github!

谢谢

维杰

【问题讨论】:

    标签: javascript base64 utf-16 utf-7


    【解决方案1】:

    我想我找到了一个足够简单的解决方案,因为没有人回应。希望有人发现这个小脚本有助于转换 UTF7

    >z='Συστήματα_Ανίχνευσης_Εισ & related security.pdf'
    >encode_imap_utf7(z)
    "&A6MDxQPDA8QDtwMBA7wDsQPEA7E-_&A5EDvQO5AwEDxwO9A7UDxQPDA7cDwg-_&A5UDuQPD- &- related security.pdf"
    >decode_imap_utf7(encode_imap_utf7(z))
    "Συστήματα_Ανίχνευσης_Εισ & related security.pdf"
    >decode_imap_utf7(encode_imap_utf7(z)) == z
    true
    /* Se RFC 2060 - no / ~ \ in folder names */
    function ureplacer(pmatch) {
        var ret = ""
        pmatch = pmatch.replace(/\,/g,'/')
        var ix = pmatch.substr(1,pmatch.length-2)
    
        if (ix.length % 4 != 0) 
          ix = ix.padEnd(ix.length+ 4 - ix.length % 4,"=")
        try {
        var dx = atob(ix)
        for (var j = 0; j < dx.length; j = j+2) {
            ret = ret + String.fromCharCode((dx.charCodeAt(j) << 8) + dx.charCodeAt(j+1))
        }
        } catch(err) {
        console.log("Error in decoding foldername IMAP UTF7, sending empty string back")
        console.log(err)
        ret = ""
        }
        return ret
    }
    
    function breplacer(umatch) {
        var bst = ""
        for (var i=0; i < umatch.length; i++) {
          var f = umatch.charCodeAt(i)
          bst = bst + String.fromCharCode(f >> 8) + String.fromCharCode(f & 255)
        }
    
        try {
        bst = '&'+btoa(bst).replace(/\//g,',').replace(/=+/,'')+'-'
        }catch(err) {
        console.log("Error in encoding foldername IMAP UTF7, sending empty string back")
        console.log(err)
        bst = ""
        }
        return bst
    }
    
    function decode_imap_utf7(mstring) {
        var stm = new RegExp(/(\&[A-Za-z0-9\+\,]+\-)/,'g')
        return mstring.replace(stm,ureplacer).replace('&-','&')
    }
    
    function encode_imap_utf7(ustring) {
        ustring = ustring.replace(/\/|\~|\\/g,'')
        var vgm = new RegExp(/([^\x20-\x7e]+)/,'g')
        return ustring.replace('&','&-').replace(vgm,breplacer)
    }
    
    

    【讨论】:

      猜你喜欢
      • 2012-09-12
      • 2021-01-11
      • 2010-10-08
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      相关资源
      最近更新 更多