【问题标题】:A tool or a way to correctly encode subject and body params on mailto links?在 mailto 链接上正确编码主题和正文参数的工具或方法?
【发布时间】:2015-04-22 09:37:10
【问题描述】:

如何转换这样的链接:

mailto:info@acme.com?body=Buongiorno, gradirei ricevere maggiori informazioni in merito alla possibilità di personalizzare i vostri prodotti.&subject=richiesta informazioni per personalizzazione prodotti

在这个:

mailto:info@acme.com?body=Buongiorno%2C%20gradirei%20ricevere%20maggiori%20informazioni%20in%20merito%20alla%20possibilit%C3%A0%20di%20personalizzare%20i%20vostri%20prodotti%26subject%3Drichiesta%20informazioni%20per%20personalizzazione%20prodotti%0A

我搜索了在线工具,但没有找到真正有用的工具

【问题讨论】:

    标签: php email uri encode subject


    【解决方案1】:

    好的,这些是真正完成 encodeURI 工作的链接:

    http://meyerweb.com/eric/tools/dencoder/

    http://pressbin.com/tools/urlencode_urldecode/

    他们使用 encodeURI 函数,并生成如下字符串:

    Buongiorno%2C%20gradirei%20ricevere%20maggiori%20informazioni%20in%20merito%20alla%20possibilit%C3%A0 etc etc....
    

    虽然大多数在线编码器会错误地(根据我的需要)生成这样的字符串:

    Buongiorno%2C+gradirei+ricevere+maggiori+informazioni+in+merito+alla+possibilit%C3%A0+di+personalizzare etc etc...
    

    原因是他们使用 urlencode() 而不是 encodeURI()

    【讨论】:

      【解决方案2】:

      正如Stratboyhis good answer 中所指出的,您必须使用将您的链接编码为URI 的函数来编码您的主题和正文(例如commonpikethis answer 中给出的那个),而不仅仅是@ 987654327@d:

      <?php
      function encodeURI($url) {
          // http://php.net/manual/en/function.rawurlencode.php
          // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI
          $unescaped = array(
              '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~',
              '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')'
          );
          $reserved = array(
              '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':',
              '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$'
          );
          $score = array(
              '%23'=>'#'
          );
          return strtr(rawurlencode($url), array_merge($reserved,$unescaped,$score));
      
      }
      
      $email = 'info@acme.com';
      $subject = 'richiesta informazioni per personalizzazione prodotti';
      $body = 'Buongiorno, gradirei ricevere maggiori informazioni in merito alla possibilità di personalizzare i vostri prodotti.';
      
      $mailtoURI = 'mailto:'.$email.'?body='.encodeURI($body).'?subject='.encodeURI($subject);
      $mailtoUrlEncode = 'mailto:'.$email.'?body='.urlencode($body).'?subject='.urlencode($subject);
      
      echo $mailtoURI; //the good one
      echo $mailtoUrlEncode; //the wrong one
      

      $mailtoURI的输出:

      mailto:info@acme.com?body=Buongiorno,%20gradirei%20ricevere%20maggiori%20informazioni%20in%20merito%20alla%20possibilit%C3%A0%20di%20personalizzare%20i%20vostri%20prodotti.?subject=richiesta %20informazioni%20per%20personalizzazione%20prodotti

      使用urlencode(注意例如空间是如何不编码的,而它们应该编码为described in MDN):

      mailto:info@acme.com?body=Buongiorno%2C+gradirei+ricevere+maggiori+informazioni+in+merito+alla+possibilit%C3%A0+di+personalizzare+i+vostri+prodotti.?subject= Richiesta+informazioni+per+personalizzazione+prodotti

      您可以直接用Javascript对其进行编码:

      var email = 'info@acme.com';
      var subject = 'richiesta informazioni per personalizzazione prodotti';
      var body = 'Buongiorno, gradirei ricevere maggiori informazioni in merito alla possibilità di personalizzare i vostri prodotti.'
      
      var mailto = 'mailto:' + email + '?body=' + encodeURI($body) + '?subject=' + encodeURI($subject);
      console.log(mailto);
      

      或者,如果您不想编写代码,可以使用the ones given in Stratboy answer 等在线工具。

      【讨论】:

        【解决方案3】:

        我刚刚创建了一个与 commonpike 略有不同的版本:

          public static function encodeURI($url) {
            $unescaped = array(
                '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~',
                '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')'
            );
            $reserved = array(
                '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','mailto%3A'=>'mailto:',
                '%3A%2F%2F'=>'://','%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$'
            );
            $score = array(
                '%23'=>'#'
            );
            return strtr(rawurlencode($url), array_merge($reserved,$unescaped,$score));
          }
        

        查看 $reserved 数组:

        'mailto%3A'=>'mailto:','%3A%2F%2F'=>'://'
        

        我需要指定它们,因为我不想取回所有的 ':'。仅在协议中使用的那些。例如,如果我需要对包含邮件正文的 URI 进行编码,其中包含一些“:”,我需要对它们进行编码,特别是如果我将 uri 保存到一些序列化的 db 字段中(“:”可能会破坏某些东西..)。所以,这是我的版本。不过,不知道对每个人是否有用。但我只是分享。

        【讨论】:

          猜你喜欢
          • 2011-10-09
          • 2018-04-21
          • 2014-01-10
          • 1970-01-01
          • 1970-01-01
          • 2019-01-08
          • 1970-01-01
          • 2014-01-29
          • 2021-12-23
          相关资源
          最近更新 更多