为什么echo()输出的base64_decode()无法在浏览器中完全显示?

时间:2012-05-17 18:37:32

标签: php base64 decode encode

请参阅以下代码:

<?php
$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpbnRlciI7DQoNCiRzdHIg
PSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+
IjsNCg0KZXZhbCgiXCRzdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
echo base64_decode($str);
?>

这是一个简单的PHP代码,您可以使用以下URL解码base64字符串:
http://www.base64decode.org/

为什么这个例子中的base64_decode()函数无法完成它的工作。 输出如下:

"; eval("\$str = \"$str\";"); echo $str; ?>  

而不是:

<?php
$string = "beautiful";
$time = "winter";

$str = 'This is a $string $time morning!';
echo $str. "<br />";

eval("\$str = \"$str\";");
echo $str;
?> 

问题是什么?如何解决大代码?

编辑:
输出中有一个不可见的部分,我可以通过页面源找到它 但为什么我们有这种反应呢? 提前谢谢

5 个答案:

答案 0 :(得分:5)

问题在于您将其视为HTML。如果您查看源代码或传递标题以使浏览器将其解释为文本,您将看到整个内容。

答案 1 :(得分:0)

eval语句只执行命令并返回字符串.... 你真正需要的是在eval内部进行评估,这有点荒谬......发生......

答案 2 :(得分:0)

尝试查看输出的来源 - 我很确定完整的内容存在,但您的浏览器正在尝试将其作为HTML读取。

回显base64编码的PHP脚本并没有神奇地评估它;你必须自己做:

eval(base64_decode($str));

答案 3 :(得分:0)

您是否添加了这些换行符?

如果你使用这样的代码:

<?php
$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpbnRlciI7DQoNCiRzdHIgPSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+IjsNCg0KZXZhbCgiXCRzdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
echo base64_decode($str);
?>

它运作得很好。

但是你在字符串中添加了换行符(“\ n”)。为了在多条线上制动它。这就是为什么它不起作用。

如果你需要在多行上制动它,你必须这样做:

<?php
$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpbnRlciI7DQoNCiRzdHIg'.
       'PSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+'.
       'IjsNCg0KZXZhbCgiXCRzdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
echo base64_decode($str);
?>

如果你想在字符串中保留这些换行符,例如,如果你有一个很大的base64编码字符串已经是自己换行的(通常是每行70-80个字符),你可以执行以下操作:

$str = 'PD9waHANCiRzdHJpbmcgPSAiYmVhdXRpZnVsIjsNCiR0aW1lID0gIndpb
        nRlciI7DQoNCiRzdHIgPSAnVGhpcyBpcyBhICRzdHJpbmcgJHRpbWUgbW
        9ybmluZyEnOw0KZWNobyAkc3RyLiAiPGJyIC8+IjsNCg0KZXZhbCgiXCR
        zdHIgPSBcIiRzdHJcIjsiKTsNCmVjaG8gJHN0cjsNCj8+IA==';
$str = implode('', preg_split('/\s*/', $str));
echo base64_decode($str);

答案 4 :(得分:0)

尝试一下可能对您有帮助。

$bodyData = strtr($str, array('-' => '+', '_' => '/'));
$messagesDetail['body'] = base64_decode($bodyData);