base64_encode 和 Convert.base64-encode 之间的 PHP 结果不同

Bap*_*aux 5 php

在 PHP 中,存在两种以 Base64 编码内容的方法。我们可以使用base64_encode接受字符串的函数或使用字符串过滤器convert.base64-encode 来与流一起使用。但我无法用这两种方法产生相同的结果。

<?php

$content = "foo";

$encoded1 = base64_encode($content);

$stream = tmpfile();

stream_filter_append($stream, 'convert.base64-encode');

fwrite($stream, $content);
fseek($stream, 0);

$encoded2 = stream_get_contents($stream);

echo sprintf(
    "Content encoded with base64_encode(): %s\nContent encoded with convert.base64-encode filter: %s\n",
    $encoded1,
    $encoded2,
);
Run Code Online (Sandbox Code Playgroud)

输出

Content encoded with base64_encode(): Zm9v
Content encoded with convert.base64-encode filter: Wm05dg==
Run Code Online (Sandbox Code Playgroud)

文档中,可以阅读此引文。

使用这些过滤器相当于分别通过base64_encode()和base64_decode()函数处理所有流数据。

Ja͢*_*͢ck 3

这是因为流过滤器以读/写模式追加自身,因此在不关闭句柄的情况下再次读取文件将再次应用 Base64;就您而言,您只希望在写入时应用过滤器。

一个简单的修复:

stream_filter_append($fp, "convert.base64-encode", STREAM_FILTER_WRITE);
Run Code Online (Sandbox Code Playgroud)

本手册的示例之一也对此进行了讨论。

  • 我明白你的解释感谢这个解决方案! (2认同)