【问题标题】:Swedish characters (ÅÄÖ) gets messed up in PclZip zip files瑞典语字符 (ÅÄÖ) 在 PclZip zip 文件中被弄乱了
【发布时间】:2015-10-09 13:35:54
【问题描述】:

我正在使用“PhpConcept 库 - Zip 模块 2.8.2”(http://www.phpconcept.net/pclzip/),也称为 pclzip 来创建 zip 文件。我在 Windows 8.1 上运行 XAMPP。

我能够创建一个好的 zip 文件内容。但是,带有瑞典字符 (åäö) 的文件和文件夹名称在 zip 文件中会变得混乱。

用法(压缩文件夹):

require_once('pclzip.lib.php');
$archive = new PclZip('archive.zip');
if ($archive->add('filestobezipped/') == 0) {
    die('Error : '.$archive->errorInfo(true));
}

我猜有一些字符编码问题。但是这应该如何解决呢? PclZip 库用户指南很难理解。 zip 格式使用 CP437 和 UTF-8。我的 php 使用的是 ISO8859-1。

【问题讨论】:

  • "PclZip 库用户指南很难理解" 那么为什么要使用它而不是 php zip 类呢? php.net/manual/en/book.zip.php
  • 我一开始尝试了 ZipArchive 类,但它的表现并不好。当 zip 文件变大 (>400Mb) 时,它就崩溃了。 PclZip 工作,但有这个东西的编码。
  • @MarcusNyberg 崩溃是什么意思? PHP 不会简单地崩溃而没有任何错误。根本原因很可能是 pclzip 库中的错误,我看到了一个潜在的修复,但它也可能导致其他问题。所以我真的建议使用受支持的库,而不是使用 9 年且仍有待更新的库。你能告诉我如何文件名“混乱”的例子吗?我看到一个问题,即包含 ÅÄÖ 的字符串会缩短,如果其中一个字符位于文件名的末尾,对我来说会产生未知的影响。

标签: php character-encoding zip pclzip


【解决方案1】:

好吧,我自己解决了这个问题,方法是添加一个回调函数“myPreAddCallBack”,该函数在每个文件添加到存档时运行。它将文件名转换为 CP437。 PCLZIP_CB_PRE_ADD 参数的文档:http://www.phpconcept.net/pclzip/user-guide/50

require_once('pclzip.lib.php');

function myPreAddCallBack($p_event, &$p_header)
{
    $encoding = mb_detect_encoding($p_header['stored_filename']);
    $p_header['stored_filename'] = iconv($encoding,"CP437",$p_header['stored_filename']);
    return 1;
}

$archive = new PclZip('archive.zip');
if ($archive->add('filestobezipped/',PCLZIP_CB_PRE_ADD, 'myPreAddCallBack') == 0) {
    die('Error : '.$archive->errorInfo(true));
}

【讨论】:

    【解决方案2】:

    Utf-8 应该包含所有瑞典字符。 iso8859-1 没有。因此,您可以使用string utf8_decode ( string $data ) 来解码压缩文件名:)。

    你可以使用 $archiveNameDecoded = utf8_decode('archivename.zip'); $archive = new PclZip(archiveNameDecoded);

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多