【问题标题】:what are the differences between PHP base64_encode and *nix base64PHP base64_encode 和 *nix base64 有什么区别
【发布时间】:2012-01-11 09:46:45
【问题描述】:

PHP 的 base64_encode 正在向 linux base64 命令返回一个不同的字符串。 这是为什么呢?

PHP:

$ php
<?php
echo base64_encode('test');
?>
dGVzdA==

Linux base64:

$ echo 'test' | base64
dGVzdAo=

【问题讨论】:

    标签: php encoding base64


    【解决方案1】:

    echo 通常在字符串的末尾输出一个换行符,以抑制使用-n 开关:

    $ echo -n 'test' | base64
    dGVzdA==
    

    PHP 也是如此:

    $ php
    <?php
    echo base64_encode("test\n");
    ?>
    dGVzdAo=
    

    【讨论】:

      【解决方案2】:

      在浏览器中打开控制台,输入atob('dGVzdAo='):


      (来源:gyazo.com)

      您的输入中有多余的字符。那是0x0A (LF)。

      【讨论】:

      • +1 atob,这对我来说是新的。
      • 顺便说一句,该功能不是任何标准的一部分,所以不要考虑在生产中使用它
      • @M28 offtopic:它在标准中:whatwg.org/specs/web-apps/current-work/multipage/…,对于 IE,您可以使用具有这两个功能的简单库(存在大量实现:1,@ 987654326@, 3, 4)。
      • @c69 这真的很奇怪,在 mozilla 网站上写着Not part of any standard(参见 Ilmari 的链接)
      【解决方案3】:

      当做回声时,它给了我这个:

      MacPro:~ bardiir$ echo 'test'
      test
      MacPro:~ bardiir$ 
      

      我猜你可能在 unix 中包含一个行尾,因为 echo 可能会附加一个换行符,即使你将它通过管道传输到 base64 编码。

      【讨论】:

      • 正确的解释,谢谢,但我将把解决方案提供给 knittl,因为他给出了“-n”的解决方法。
      • 当然,对我来说也是一个新的 :)
      【解决方案4】:

      linux base64末尾有一个新行。

      【讨论】:

        【解决方案5】:

        这是因为 Unix 版本也对行尾进行编码。

        要在 PHP 中获得类似的效果,您必须执行以下操作:

        echo base64_encode('test'.PHP_EOL);
        

        将输出:

        dGVzdAo=
        

        在此处查看证明:ideone.com/HorVD

        编辑: 正如查尔斯所说,PHP_EOL 是特定于平台的,因此要在 Windows 上检查上述内容,您必须将其替换为类似 Unix 的行尾符号:

        echo base64_encode("test\n");
        

        【讨论】:

        • 注意,PHP_EOL 是特定于平台的,在 Windows 上会有所不同。
        • @Charles:谢谢,我根据您的通知更新了我的答案。我认为这会更有意义,因为他用 Linux 的base64 对 Linux 的行尾进行编码,并且使用平台的行尾是最合适的。然而,我想知道,在 Windows 上是否有类似的可能(例如,使用 PowerShell?,可能使用不同的语法,但也会导致字符串以行尾处理,但这次是 Windows 的)。
        • 在 PowerShell 中的字符串上看起来像 base64ing can be done。从它处理字符串而不是特定命令的输出这一事实来看,可能不需要担心悬空的换行符。
        【解决方案6】:

        和上面的人一样。

        在 mac os X 中,只需测试一下:

        $ echo  'test' | cat -e
        
        test$
        

        或者,

        $ echo -n  'test' | cat -e
        
        test
        

        还有,关于echo命令,可以看提示:

        echo -e option in ubuntu doesn't work

        【讨论】:

        • 必须通过 cat 管道的原因是什么?
        猜你喜欢
        • 2018-04-16
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 2017-12-25
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多