Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
Downloads
/
vfm-admin
/
assets
/
zipstream
/
grandt
/
phpzipmerge
/
src
/
ZipMerge
/
Zip
/
Core
/
ExtraField
:
UnicodePathExtraField.php
Voltar
Back Up
Advanced Editor
Save
<?php /** * * @author A. Grandt <php@grandt.com> * * Classes to assist in handling extra fields * */ namespace ZipMerge\Zip\Core\ExtraField; use com\grandt\BinStringStatic; /** * * -Info-ZIP Unicode Path Extra Field: * ================================= * * Stores the UTF-8 version of the entry path as stored in the * local header and central directory header. * (Last Revision 20070912) * * Value Size Description * ----- ---- ----------- * (UPath) 0x7075 Short tag for this extra block type ("up") * TSize Short total data size for this block * Version Byte version of this extra field, currently 1 * NameCRC32 Long CRC-32 checksum of standard name field * UnicodeName variable UTF-8 version of the entry file name * * Currently Version is set to the number 1. If there is a need * to change this field, the version will be incremented. Changes * may not be backward compatible so this extra field should not be * used if the version is not recognized. * * The NameCRC32 is the standard zip CRC32 checksum of the File Name * field in the header. This is used to verify that the header * File Name field has not changed since the Unicode Path extra field * was created. This can happen if a utility renames the entry but * does not update the UTF-8 path extra field. If the CRC check fails, * this UTF-8 Path Extra Field should be ignored and the File Name field * in the header should be used instead. * * The UnicodeName is the UTF-8 version of the contents of the File * Name field in the header, without any trailing NUL. The standard * name field in the Zip entry header remains filled with the entry * name coded in the local machine's extended ASCII system charset. * As UnicodeName is defined to be UTF-8, no UTF-8 byte order mark * (BOM) is used. The length of this field is determined by * subtracting the size of the previous fields from TSize. * If both the File Name and Comment fields are UTF-8, the new General * Purpose Bit Flag, bit 11 (Language encoding flag (EFS)), should be * used to indicate that both the header File Name and Comment fields * are UTF-8 and, in this case, the Unicode Path and Unicode Comment * extra fields are not needed and should not be created. Note that, * for backward compatibility, bit 11 should only be used if the native * character set of the paths and comments being zipped up are already * in UTF-8. The same method, either general purpose bit 11 or extra * fields, should be used in both the Local and Central Directory Header * for a file. * * Utilisation rules: * 1. This field shall never be created for names consisting solely of * 7-bit ASCII characters. * 2. On a system that already uses UTF-8 as system charset, this field * shall not repeat the string pattern already stored in the Zip * entry's standard name field. Instead, a field of exactly 9 bytes * (70 75 05 00 01 and 4 bytes CRC) should be created. * In this form with 5 data bytes, the field serves as indicator * for the UTF-8 encoding of the standard Zip header's name field. * 3. This field shall not be used whenever the calculated CRC-32 of * the entry's standard name field does not match the provided * CRC checksum value. A mismatch of the CRC check indicates that * the standard name field was changed by some non-"up"-aware * utility without synchronizing this UTF-8 name e.f. block. * */ class UnicodePathExtraField extends AbstractUnicodeExtraField { public function __construct($handle = null) { parent::__construct($handle); if ($handle == null) { $this->header = parent::HEADER_UNICODE_PATH; } } /** * @return string The version of the field for the Local Header. */ public function getLocalField() { return parent::HEADER_UNICODE_PATH . pack('vV', BinStringStatic::_strlen($this->utf8Data) + 5, $this->CRC32) . $this->version . $this->utf8Data; } /** * @return string The version of the field for the Central Header. */ public function getCentralField() { return $this->getLocalField(); } }