FL_ENC_RAW 是 ZipArchive::addFromString 的有效标志吗?

Is FL_ENC_RAW a valid flag for ZipArchive::addFromString?

我有一个包含二进制 jpeg 数据的“字符串”变量。我想将此 jpeg 添加到一个 zip 文件中。根据 the documentation $flags 参数是

Bitmask consisting of ZipArchive::FL_OVERWRITE, ZipArchive::FL_ENC_GUESS, ZipArchive::FL_ENC_UTF_8, ZipArchive::FL_ENC_CP437.

ZipArchive::FL_ENC_GUESS 可能会起作用,但听起来这将尝试根据我的变量的内容试探性地猜测编码。如果我想明确一点,我应该将 $flags 设置为 ZipArchive::FL_ENC_UTF_8 还是 ZipArchive::FL_ENC_CP437?在两者之间,ZipArchive::FL_ENC_UTF_8 似乎是更好的选择。

ZipArchive::FL_ENC_RAW 似乎是我真正应该使用的,但根据文档,这不是该特定函数的有效标志。这是遗漏吗?据我所知,它没有被列为任何函数的有效标志。

ZipArchive::addFromString is calling zip_file_add under the hood. If we take a look at the documentation for that function in libzip 我们找到了关于每个标志的作用的更多描述性解释:

  • ZIP_FL_ENC_UTF_8: Interpret name as UTF-8.
  • ZIP_FL_ENC_CP437: Interpret name as code page 437 (CP-437).

ZipArchive::FL_ENC_UTF_8ZipArchive::FL_ENC_CP437 影响 文件名 (又名 $name 参数)的解释方式,而不是文件本身内的数据.无论数据是 UTF-8、CP-437、二进制数据还是其他任何数据,文件内容的处理方式都是一样的。

这已在该库的 php tests 中得到确认,其中这 4 行

$zip->addEmptyDir(chr(0x82), ZipArchive::FL_ENC_CP437);
$zip->addEmptyDir('è', ZipArchive::FL_ENC_UTF_8);
$zip->addFromString(chr(0x91), __FILE__, ZipArchive::FL_ENC_CP437);
$zip->addFromString('€', __FILE__, ZipArchive::FL_ENC_UTF_8);

预计会生成具有以下名称的文件

  • é(对应第437页字符hex:82 dec:130)
  • è
  • æ(对应第437页字符hex:91dec:145)